面试题-Java集合(新更新版本)

前言

Java集合部分的题目,是我根据Java Guide的面试突击版本V3.0再整理出来的,其中,我选择了一些比较重要的问题,并重新做出相应回答,希望对大家起到一定的帮助。

Java集合

Java集合

  1. 说说Arraylist 与 LinkedList 区别?

    ArrayList的底层数据结构是数组,LinkedList的底层数据结构是链表。

    问题的本质其实是数组和链表的区别:

    • 查找方面:按值查找的话,数组和链表的时间复杂度都是O(N);按索引查找的话,数组的时间复杂度是O(1),链表的时间复杂度是O(N)
    • 插入和删除方面:数组的插入和删除因为需要移动数据,所以平均时间复杂度为O(N);链表为O(1)
  2. 说⼀说 ArrayList 的扩容机制?

    按照1.5倍的长度来创建一个新的数组,然后把原始数据拷贝过去。

    在实际开发中,如果插入的数据量较大,可以使用ensureCapacity提前扩容到指定大小,来提高性能。

  3. HashSet的底层实现?

    HashSet底层用的就是HashMap实现的,key存储实际的对象,value存储一个默认的Object

  4. 说一说HashMap的底层数据结构 和 扩容机制

    • Jdk1.8以前,是数组+链表;1.8以后,是数组+链表或者红黑树;当链表长度达到8时,会转变为红黑树,目的是为了提高按照值查找时的时间复杂度,从链表的O(N)提高到红黑树的O(logN)
    • 默认初始化一个长度为16的数组,当 键值对个数 > 数组长度 * 负载因子时 就会进行扩容,扩容至原始长度的2倍。
  5. HashMap的长度为什么是2的幂次方?

    hash值需要根据数组实际长度进行取模运算从而找到索引位置,如果是2的幂次方,可以把取模运算转化为位运算,提高性能。h%length == h&(length-1)

  6. HashMap和Hashtable的区别?

    HashMap不是线程安全的,当rehash时可能会形成环形链表;HashTable是线程安全的,实现机制是加sync锁

    HashTable不允许存Null的key和value,HashMap则可以。

  7. ConcurrentHashMap 和 Hashtable 的区别?

    ConcurrentHashMap在1.7之前,使用分段锁来提高并发度;1.8之后,使用sync+CAS来实现线程安全,并且只锁定链表的头部,效率比分段锁又有所提高。

posted @ 2020-08-10 09:41  Ging  阅读(141)  评论(0编辑  收藏  举报