面经面经

面经大总结

笔者总结了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器中

答:关于垃圾回收器可以看我之前的博客。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值