面经大总结
笔者总结了2019年秋招目前为止的面试经验。希望能对大家有帮助,攒人品攒人品!
Java集合篇
问:ArrayList与LinkedList的区别?
答:首先,ArrayList和Linklist都实现了List接口但由于实现不同,功能也不同,首先是ArrayList,ArrayList是通过数组实现的,数组的特性就是可以通过索引快速的定位到查找元素,所以对于经常执行随机查询的需求,我们可以使用ArrayList;然后是Linklist,Linklist是通过链表实现的,所以它在添加和删除的操作上,效率更高,因为ArrayList在添加和删除时,会影响目标元素后面的元素位置。
问:集合类有哪些?Map有哪些?List有哪些?
答:说到java集合类,首当其冲的就是三个接口了,分别是Iterator,Collection和Map了,Iterator中封装了遍历集合的方法,所有几何都实现了这个接口;Collection接口下还继承了三个接口,分别是List,Set,Queue。其中经常使用到的有List接口和Set接口。List接口下面还有abstractlist抽象类,set接口下面还有abstractset和sortedset抽象类。经常用到的集合类有,ArrayList,Linklist(区别在上一题),hashset和treeset;Map接口下经常用到的类有hashMap和TreeMap
问:hashmap的底层原理实现?
答:hashmap实现了map接口,hashmap存储的对象是一对对键值对的映射,是线程不安全的,key唯一,可以有空值,但是空值只能唯一,value可以为空也可以重复。衡量hashmap容量的因素有两个,一个是初始容量,一个是加载因子。初始容量表示了最初的数组容量,加载因子表示的是链表可以扩充的程度。加载因子默认为0.75。在向hashmap中添加元素时,我们首先根据key的hashcode计算得出插入的位置,如果插入位置不为空,那么就存入该位置的链表中,后插入的在表头,之前插入的在表尾。如果插入过程中超过了加载因子,那么执行rehash方法,将容量扩大到约原容量的两倍,重新分布存储对象。这里要说的是hashmap的容量是2的n次方。因为这与hashmap存放对象的实现有关,在存放对象时我们将对象key的hashcode和容量-1进行与运算,如果不使用2的n次方表示,会造成空间浪费。
问:hashmap在jdk1.7和jdk1.8的区别?
答:jdk1.8中引入了Node接口代替链表结构,Node可以是链表,也可以是红黑树。
问:hashmap,hashtable,concurrentHashmap的区别?
答:hashmap和hashtable的区别主要是hashtable是线程安全的,效率低一些,同时hashtable的key和value都不能为空。concurrentHashmap也是线程安全的,同时concurrentHashmap引入了分段锁的概念,可以支持任意线程的读操作以及最大为16的写操作。
多线程篇
问:说一下线程安全的几种手段?
答:线程之所以不安全是因为线程之间存在资源共享,所以解决线程安全的方法之一可以是,然线程拥有资源,避免共享资源;另一种方法是对线程加锁,可以用lock和synchronize加锁。
问:你知道那些加锁机制?
答:(1)可重入锁:可重入锁主要用来防止死锁,同时也说明了锁的分配是对于线程而言的,不是对于方法而言的。
(2)可中断锁:可中断锁就是可以中断的锁,synchronize不是可中断锁,lock是可中断锁
(3)公平锁:在多个线程抢占对象锁时,公平锁可以做到等待时间最长的线程获得对象锁
(4)非公平锁:顾名思义就是线程在抢夺对象锁时是随机的。
(5)互斥锁:悲观锁,当发生锁竞争时,没有等到对象锁的线程会被阻塞。
(6)自旋锁:乐观锁,当发生锁竞争时,没有得到对象锁的线程不会立即进入阻塞,而是会自旋等待,多次尝试。但同时要有时间限制,也要防止死锁的发生。
问:Lock与synchronize有什么区别?
答:(1)lock是接口,synchronize是关键字
(2)lock是中断锁,synchronize不是,必须要等待所得释放。
(3)synchronize在发生异常的时候会主动释放锁,而lock不会,可能发生死锁。
(4)lock可以通过readwritelock提高线程读的效率。
虚拟机篇
问:JVM类加载机制?
答:java类加载,就是把class文件加载进内存,然后对数据进行校验,准备,解析和初始化的过程。最终能形成能被JVM直接使用的Java类型的过程。
其中的每一步都很重要:首先是(1)加载:将class文件写入内存,然后将静态数据结构转化为方法区中的数据结构,同时在堆中创建一个代表这个类的访问入口。
(2)链接,链接包含,验证,准备,解析。验证:检验加载的类是否符合jvm的标准;准备:给静态变量分配内存空间,设置初始值;解析:将字符串常量的符号引用变为直接引用。
(3)初始化:执行构造器方法,由编译器自动收集变量的赋值动作与静态变量和静态代码块合并。
问:GC算法
答:关于垃圾回收算法可以去看我之前的博客。
问:GC器中
答:关于垃圾回收器可以看我之前的博客。