Java基础面试题2018-08-29

一、hashmap、hashtble、concurrenthashmap的区别以及实现原理

      1.hashmap是数组+链表的数据结构,hashmap线程不安全,因为可能会出现多个线程同时对hashmap的容量进行计算,或者是同时放入相同的key,造成值被覆盖。

     2.hashtable采用synchronized同步锁,保证同一时间只有一个线程能进行操作,但是锁的同时,其它线程连get操作都会被阻塞,造成性能下降。

     3.concurrenthashmap采用锁段的方式进行同步,这样能极大提对map的操作效率。在JDK8中采用了转平衡树的方式进行处理。
二、hashmap发生hash碰撞时候怎么处理?链表过长怎么解决?

    1.同一个hashcode的entity存放在链表时候顺序是hashmap发生碰撞后,会把相同hashcode的key放在同一个链表下面。取数据时先根据hashcode找到链表位置,然后根据key的eques方法找到正确的存储对象

    2.链表过长时,超过8时,链表转红黑树;低于6时,会转为链表。

三、concurrenthashmap的初始化个数是多少、负载因子是多少、扩展长度是多少、扩展时候有什么问题?

     默认长度16;负载因子0.75;2倍拓展; 扩展时候会重新hashing,会造成资源和时间消耗。

   (拓展阅读:segment在JDK1.8中已经摒弃)

四、arrayList和linkList区别是什么?集合负载因子多少?扩展长度是多少?

      1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构;对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针;对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

      2.负载因子1,即:元素满之后才扩展。

      3.拓展长度是原容量的0.5倍+1

五、synchronised和lock的区别?

      1.首先synchronized是java内置关键字,因此是内置特性,而Lock是个java类;

      2.synchronized无法判断是否获取锁的状态,Lock可以判断是否获取到锁;

      3.synchronized会自动释放锁(a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁);Lock需在finally中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;

      4.synchronised代码块执行时,其它线程必须一直等待;lock时,其它线程可以通过设置等待时间,而不用一直等待。

      5.synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)

      6.Lock锁适合大量同步代码的同步问题,synchronized锁适合代码少量的同步问题。

六、简单介绍下的偏向锁、轻量级锁、自旋锁、膨胀锁

è¿éåå¾çæè¿°

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值