面试问题记录 一 (基础部分) (2)

答:Map是一种数据存储容器,数据是以键值对的形式进行存储,也就是底层是以哈希表的方式实现的,而哈希表在JDK8之前是数组+链表,而从JDK8开始是以数组+链表+红黑树的方式实现的。Map下主要有两个实现类HashMap和TreeMap;HashMap插入、删除和定位元素很快,如果是对一个有序的Key集合进行遍历则选TreeMap;
具体Map实现原理可参考这篇博文 (Map实现原理)

3.如何实现List和数组的转换?

答:List转数组调用toArray方法,数组转List调用Arrays的asList方法

4.ArrayList和LinkedList的区别是什么?

答:ArrayList底层数据结构是双向链表、支持随机访问;LinkedList底层数据结构是双向循环链表、不支持随机访问;而且前者时间复杂度是O(1)而后者是O(n)。

三、多线程 1.创建线程有哪几种方式?说说它们有什么区别?

答:一是继承Thread类,创建实例,重写run方法,二是实现Runable接口,重写接口中run方法,三是通过Callable和Future创建,第三种并未了解过。前两种⽅式都是通过run这个⽅法来创建线程,然后通过start启动线程;不管是哪两种⽅式,最终都是通过调⽤Thread类的对象的API来控制线程。相⽐继承类的⽅式,实现接⼝的⽅式⼀是适合多个相同的程序代码处理同⼀个资源,⼆是代码可以被多个线程共享,三是避免了单继承,四是线程池只能放⼊实现runable或callable类线程,不能直接放⼊继承Thread的类中。

2.线程的run方法和start方法有什么区别?

答:每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run成为线程体,通过调用Thread类的start方法来启动线程;而run方法只是线程中的一个方法,而不是多线程的,直接调用run方法必须等待run方法执行完毕才能执行接下来的代码,所以执行路径还是只有一条,没有多线程的特征;而start是用来启动一个线程,也真正实现了多线程运行,也就是无需等待run方法体代码执行完毕,可以直接继续执行下面的代码,这时候线程是处于就绪状态,然后通过此Thread类调用run方法来完成

其运行状态,而run此时称为线程体,它包含了要执行的这个线程的内容,run方法运行结束,此线程终止。

3.创建线程池的几种方式?

答:Executors工具类是通过调用底层ThreadPoolExecutor构造方法实现线程池的创建,一是创建定长的线程池,二是创建单线程化的线程池,三是创建可缓存的线程池,四是创建一个支持线程定时操作和周期操作的线程池。
具体参考这篇文章:ThreadPoolExecutor线程池解析及Executor创建线程常见四种方式

4.synchronize和volatile的区别是什么?

答:一是synchronize关键字可以使用在变量、方法、和类别之前,而volatile只能使用在变量上;二是synchronize是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住,而volatile是告诉jvm当前变量在寄存器中的值不确定,需要从主存中读取;三是synchronize可能造成线程阻塞,而volatile不会;四是synchronize可以保证变量的修改可见性和原子性,而volatile只能实现变量修改可见性,不能保证原子性;五是synchronize标记的变量可以被编译器优化,volatile标记的变量不会被编译器优化。

5.怎样保证多线程的运行安全

答:线程安全体现在三个方面:一是原子性(提供互斥访问,同一时刻只能有一个线程对数据进行操作),二是可见性(一个线程对主内存的修改可以及时的被其他线程看到),三是有序性(一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无章)。

三、反射 1.反射是什么?有什么用?

答:首先反射主要是指程序可以访问、检测和修改它本身状态或行为的能力;其次再Java运行环境中,我们可以对任意一个类,知道有哪些属性和方法,对于任意一个对象,能否调用它的任意一个方法;即在运行时判断任意一个对象所属的类和这个类所具有的成员变量和方法,还有就是在运行时去构造任意一个类的对象和任意一个对象的方法。

四、异常 1.final、finally和finalize有什么区别?

答:final可以修饰类、变量、方法,表示该类不能被继承、该方法不能被重写、该变量不能被赋值;finally主要是处理异常的时候用,也就是finally代码块中的代码都会执行,一般用来存放一些关闭资源的代码。finalize是属于Object类的一个方法,即当我们去调用System的gc方法时候,由垃圾回收器调用finalize方法,回收垃圾。

2.try-catch-finally的出口是什么,catch中return后,finally还会执行吗?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfjgd.html