javaSE基础

发布时间 2023-09-05 14:35:32作者: 紫宁不嗣音

1、Java语言有哪些特点

  • 面向对象
  • 跨平台
  • 支持多线程

2、面向对象和面向过程的区别

面向过程:是分析如何解决问题步骤,并通过函数将这些步骤一个个实现,在需要使用的时候就可以调用这些函数。相较之下性能很高。

面向对象:是把业务分解为各个对象,用这些对象去描述在解决整个问题中发生的行为。它有着封装、继承、多态这些特性,有着易维护、易复用、易拓展。

3、基本数据类型与引用数据类型

基本数据类型在声明的时候系统会自动分配空间,而引用数据类型只是分配引用空间,如果没有实例化开辟空间才能赋值!

4、标识符的命名规则

规则:英文字母、数字、$和_组成的(不能是关键字且数字不能作为开头)

规范:类名首字符大写,后面每个单词首字母大写;方法/接口/属性名都是首字母小写,后面每个首字母大写

5、instanceof 关键字的作用

boolean result = obj instanceof Class

他是用来比较一个对象是否属于一个类的实例 如果是就会返回true,否则为false。

但是要注意编译器会检查obj是否能转换成右边的Class类型,如果不能转换则报错

javaSE规范了如果obj为null,那么将返回 false。

6、Java自动装箱与拆箱

  • 装箱就是自动把基本类型转换为包装器类型(int->Integer),调用方法是Interger的valueOf(int)方法
  • 拆箱就是自动吧包装器类型转换为基本类型(Integer->int),调用方法是Interger的intValue方法

注意点:

  • 如果通过自动装箱 创建Interger对象时,数值在[-128,127]之间则返回IntegerCache.cache已存在的对象引用,否则创建新对象。

  • 在某个范围内的整型数值的个数是有限的,而浮点数却不是。

7、 重载和重写的区别

重写:

  • 子类需要继承父类的原有方法,对但其中的某个方法需要改动,就会用到重写,去覆盖父类的方法。

  • 重写是方法名、参数列表、返回类型都相同的情况,或者说返回类型必须是父类中方法的返回值的子类。当然了子类中的方法访问权限是不能少于父类的。

重载:

  • 在一个类中同名但参数列表不同则是重载,对返回值什么的都没有要求,也不能通过返回类型去判断是否重载,这是多态性的一种体现

8、 equals与==的区别

==是判断栈内存中存放堆内存地址是否相同,也就是说, 它判断的是两个对象地址是否相同(是不是指向同一个对象)

而equals本质是object类中的一个方法,它底层源码实际

大多是用来判断两个对象的内容是否相等,它是object类中的方法,在object里它实际返回的就是==的判断,但大多类都会重写equals方法去用判断两个对象的内容是否相等。

  • 这也是两者最本质的区别,==判断是否指向同一个对象,equals判断两个对象内容是否相等

9、 Hashcode的作用

java集合的两个类List和Set ,list有序可重复,但set无序不重复的,当在set中插入一个元素,我们可以用equals判断是否存在,但是元素太多的情况下,效率会很差。

所以就有了Hashcode方法的存在,它其实是返回根据对象内存地址换算成一个值,每次添加新元素,先调用它的Hashcode方法,就能定位到它对应的物理位置上,再去判断是否有相同元素,如果没有直接存进去,如果有了再调用equals判断是不是同一个内容,相同就不存,不同再放到其他地址上去。

10、String、StringBuffer 和 StringBuilder 的区别是什么?

String: 是只读字符串,它是不可变的,每次创建都会生成新String对象(底层是final char)

StringBuffer和StringBuilder都继承了了AbstractStringBuilder这个抽象类

它们底层是可变的字符数组。但

StringBuilder是线程不安全的而StringBuffer线程安全(加了同步锁)

11、ArrayList和linkedList的区别

List是有序可重复集合,提供了索引,继承Collection

ArrayList是能自动增长容量的一个数组,它底层源码实现的是数组扩容。

{toArray返回一个数组,AsList返回一个列表}

LinkedList是一个双链表的数据结构,在添加、删除元素方面比Arraylist更方便,但get、set这种就不如Arraylist了。

12、 HashMap和HashTable的区别

  • 父类不同:HashMap继承的是AbstractMap类,Hashtable继承的是Dictionary类

  • 接口不同:它们都实现了map、Cloneable可复制、Serializable可序列号的接口,但Hashtable多提供了elements() 和contains() 两个方法。 elements返回的是hashtable中value的枚举、contains判断hashtable是否包含传入的value它跟containsvalue方法一样。

  • null的支持不同:HashTablekey和value都不允许为null;HashMap则可以,只要保证Key的一致性即可

  • 安全性不同:HashMap是线程不安全的但是高性能的,HashTableke线程安全但是损耗了很多性能。(每个方法都用了同步锁)

(多线程往往使用ConcurrentMap使用了分段锁)

  • ........(计算hash值不同、初始容量大小与每次扩容量也不同)

13、 Collection包结构,与Collections的区别

Collection是集合类的上级接口,它的子接口有List、Set、L;inkedList、ArrayList等

Collections是集合类的一个帮助类,它就像一个工具类一样,服务Collection框架,包括实现对各种集合的搜索、排序、线程安全化等功能。

14、 Java的四种引用,强弱软虚

  • 强引用:在内存不足时也不会被回收 String

  • 弱引用:在内存不足时会被回收 SoftReference(new String("str")) 创建缓存的时候,创建的对象放缓存中

  • 软引用:被java垃圾回收站发现就回收 WeakReference(str)

  • 虚引用:跟软引用差不多,只是在回收前就在ReferenceQueue中与其他引用不同 PhantomReference(new String("str"),new ReferenceQueue<>())

15、 泛型常用特点

可以被不同类型的对象所重用

只要把底层存储设置为Object类就可以通过规则控制自己想要存储的数据类型

16、Java创建对象有几种方式

  • 使用 new 关键字(最常用): ObjectName obj = new ObjectName();

  • 使用反射Class类的newInstance()方法:ObjectName obj = ObjectName.class.newInstance();

  • 使用反射Constructor类的newInstance()方法:

    ObjectName obj =ObjectName.class.getConstructor.newInstance();

  • 使用反序列化(ObjectInputStream)readObject()方法:

17、有没有可能两个不相等的对象有相同的hashcode

在产生 hash 冲突时,两个不等的对象就会有相同的 hashcode 值。

  • 开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址

  • 再哈希:当发生冲突时,使用第二个,第三个….等哈希函数计算地址,直到无冲突

18、深拷贝和浅拷贝的区别是什么?

浅拷贝:仅仅复制所考虑的对象,而不复制它所引用的对象

深拷贝:把要复制的对象所引用的对象都复制了一遍.

19、final有哪些用法?

  • 被fifinal修饰的类不可以被继承
  • 被final修饰的方法不可以被重写
  • 被final修饰的变量不可以被改变.如果修饰引用,,那么表示引用不可变,引用指向的内容可变.
  • 被final修饰的方法,JVM会尝试将其内联,以提高运行效率
  • 被final修饰的常量,在编译阶段会存入常量池

20、static都有哪些用法?

静态变量静态方法静态块静态内部类

(静态内部类只能访问外部类的静态成员)

(静态块优先于构造块执行,并且不管有多少个实例化对象,静态块只执行一次,往往执行初始化操作)

21、3*0.1 == 0.3返回值是什么

false,因为有些浮点数不能完全精确的表示出来.

22、a=a+b与a+=b有什么区别吗?

+= 操作符会进行隐式自动类型转换,而a=a+b不会

byte a,b; a=a+b(int->byte 出错) a+=b 不会错

23、try catch finally,try里有return,finally还执行么?

执行,并且finally的执行早于try里面的return

24、 Excption与Error包结构

Java可抛出的结构有

  • 运行时异常(RuntimeException)(java编译器不会检查)
    • ClassCastException(类转换异常)
    • IndexOutOfBoundsException(数组越界)
    • NullPointerException(空指针异常)
    • ArrayStoreException(数据存储异常,操作数组是类型不一致)
    • BufffferOverflflowException(缓冲区溢出异常)
  • 被检查的异常(CheckedException) (会被检查,一般可以恢复)
    • SQLException
    • FileNotFoundException
    • IOException
  • 错误(Error)。

25、OOM遇到过哪些情况,SOF遇到过哪些情况

oom:

  • 1、Java heap space

    • 当堆内存(Heap Space)没有足够空间存放新创建的对象时,就会抛出java.lang.OutOfMemoryError:Javaheap space 错误
  • GC overhead limit exceeded

    • 就是应用程序已经基本耗尽了所有可用内存, GC 也无法回收。
  • Permgen space

    • Permgen space

SOF:

  • StackOverFlowError异常
  • 递归调用时出现或死循环,原因是:线程请求的栈深度大于虚拟机所允许的深度

26、简述线程、程序、进程的基本概念。以及他们之间关系是什么?

程序是指令和数据的有序集合,他是静态的;

在操作系统中运行的程序就是进程;

一个进程中至少有一个线程,当然也可以有若干个线程


27、Java 序列化中如果有些字段不想进行序列化,怎么办?

使用 transient 关键字修饰不想进行序列化的变量

28、说说Java 中 IO 流

  • 按照流的流向分,可以分为输入流输出流

  • 按照操作单元划分,可以划分为字节流字符流

  • 按照流的角色划分,可以划分为节点流处理流

  • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。

  • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

29、 Java IO与 NIO的区别(补充)

NIO主要用到的是,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO

  • 网络编程NIO
  • 标准输入输出NIO

30、java反射的作用于原理

  • 在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息

这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制

Class.forName('com.mysql.jdbc.Driver.class');//加载MySQL的驱动类  jdbc就是典型的反射

反射的实现方式

  • 获取Class对象(四种方法)
    • Class.forName(“类的路径”)
    • 类名.class
    • 对象名.getClass()
    • 基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象

实现Java反射的类

  • Class:表示正在运行的Java应用程序中的类和接口 注意: 所有获取对象的信息都需要Class类来实现
  • Field:提供有关类和接口的属性信息,以及对它的动态访问权限。
  • Constructor:提供关于类的单个构造方法的信息以及它的访问权限
  • Method:提供类或接口中某个方法的信息

反射优点

  • 能够运行时动态获取类的实例,提高灵活性

反射缺点

  • 性能低、不够安全,破坏了封装性

31、说说List,Set,Map三者的区别?

  • List(对付顺序的好帮手): List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象

  • Set(注重独一无二的性质): 不允许重复的集合。不会有多个元素引用相同的对象。

  • Map(用Key来搜索的专家): 使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。

32、Object 有哪些常用方法?大致说一下每个方法的含义

  • clone 方法(浅复制)【需要实现 Cloneable 接口 重写该方法进行深复制】

  • finalize 方法 (垃圾收集器)【重写该方法可判断一个对象是否可以被回收】

  • equals 方法(判断两个对象的内容是否相等) 【在Object中与==一样】

  • hashCode 方法(哈希查找,一般与equals连用)

  • wait 方法(等待对象的锁直到获得锁或者被中断) 【调用该方法后当前线程进入睡眠状态】

  • notify 方法(唤醒在该对象上等待队列中的某个线程)

  • notifyAll 方法(法唤醒在该对象上等待队列中的所有线程)

33、Java 创建对象有几种方式?

创建对象的方式关键字:new、反射、clone 拷贝、反序列化。

34、获取一个类Class对象的方式有哪些?

  • 通过类对象的 getClass() 方法获取
  • 通过类的静态成员表示,每个类都有隐含的静态成员 class
  • 通过 Class 类的静态方法 forName() 方法获取

35、ArrayList 和 LinkedList 的区别有哪些?

  • ArrayList方便查询
  • LinkedList方便增删

36、说一下ArrayList有什么特点?

  • java数据集合框架的一种存放同类型的元素数据,是变长的集合类。
  • 底层是数组实现添加元素。 内核就是能自动扩容的数组
  • 高并发下线程不安全,容易出现异常或错误
  • 实现了cloneable接口,可以被复制(里面的clone方法是浅复制)
  • add(o)是添加到尾部,大批量添加应该使用ensureCapacity()提前设置好大小,提高初始化速度
  • add(int,o)是添加到某个位置,它会挪动很多元素,可能触发数组扩容机制

37、有数组了为什么还要搞个 ArrayList 呢?

普通数组面对不知道插入多少的时候就会很尴尬,不知道初始化大小是多少,每次超出大小还得实现数组扩容功能,为了提高代码复用性,封装出ArrayList

数组是定死的数组,ArrayList 却是动态数组

38、说说什么是 fail-fast?

它是集合中的一个错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生 fail-fast 事件。

当一个线程遍历集合,但集合又在被其他线程修改了,那遍历集合的线程就会抛出异常,产生fail-fast机制了。

  • 解决方法是使用“java.util.concurrent 包下的类”去取代“java.util 包下的类”

40、HashMap 中的 key 我们可以使用任何类作为 key 吗?

正常大多是用String作为HashMap的key,如果想用自定义的,也是可以的 但是要注意一下

  • 如果类重写了 equals 方法,它也应该重写 hashCode 方法
  • 如果一个类没有使用 equals,你不应该在 hashCode 中使用它
  • key 最好不可变

41、HashMap 的长度为什么是 2 的 N 次方呢?

为了存取效率高,尽量把数据能均匀的分配,每个链表或者红黑树长度尽量相等

取余(%)操作中如果除数是 2 的幂次,则等价于与其除数减一的与(&)操作

(也就是说hash % length == hash &(length - 1) 的前提是 length 是 2 的 n 次方)。

并且,采用二进制位操作 & ,相对于 % 能够提高运算效率。

42、HashMap 与 ConcurrentHashMap 的异同

  1. 都是 key-value 形式的存储数据,都是键值对
  2. HashMap 是线程不安全的,ConcurrentHashMap 是 JUC 下的线程安全的
  3. HashMap 底层数据结构是 数组 + 链表 (+ 红黑树)//元素个数达到8的时候转为红黑树查询速度更块
  4. HashMap 默认初始数组大小为 16,以 0.75 * 数组大小的方式进行扩容
  5. ConcurrentHashMap 1.8前是分段锁来实现的 Segment + HashEntry;1.8之后是Node + CAS + Synchronized来保证并发安全进行实现

43、红黑树有哪几个特征?

  • 每个结点是红色或黑色
  • 根节点是黑色
  • 叶子结点为黑色(指向空的叶子结点)
  • 如果一个叶子结点是红色的,那它的子结点都是黑的(父子不相邻)
  • 从一个结点到该结点的子孙结点的所有路径上包含相同数的黑色结点

44、处理 Java 异常的

try-catch-fifinally

try 块负责监控可能出现异常的代码

catch 块负责捕获可能出现的异常,并进行处理

fifinally 块负责清理各种资源,不管是否出现异常都会执行

其中 try 块是必须的,catch 和 fifinally 至少存在一个标准异常处理流程

45、深拷贝和浅拷贝

浅拷贝:只是增加了一个指针指向已存在的内存地址

深拷贝:是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新的内存