• Java集合面试题整理(超详细)


    1. 请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?ArrayList底层 是什么?扩容机制?Vector和ArrayList的最大区别?

    答:ArrayList和LinkedList的异同:

           二者都线程不安全,相对线程安全的Vector,执行效率高。 此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。对于 随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。对于新增 和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。

    ArrayList和Vector的区别

           Vector和ArrayList几乎是完全相同的,唯一的区别在于Vector是同步类(synchronized),属于 强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用 ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大 小的2倍空间,而ArrayList是1.5倍。Vector还有一个子类Stack。

    2. 简述HashMap和Hashtable的区别

    答:1.HashMap与Hashtable都实现了Map接口。由于HashMap的非线程安全性,效率上可能高于Hashtable。Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。

    2. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

    3.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。

    4.Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。

    5.Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

    3. 说一说HashMap什么时候进行扩容呢?

    答:当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数 size)*loadFactor 时, 就 会 进 行 数 组 扩 容 , loadFactor 的默认 值 (DEFAULT_LOAD_FACTOR)为0.75,这是一个折中的取值。也就是说,默认情况 下,数组大小(DEFAULT_INITIAL_CAPACITY)为16,那么当HashMap中元素个数 超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把 数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置, 而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数, 那么预设元素的个数能够有效的提高HashMap的性能。

    4. 说一下HashMap的底层是怎么实现的

    答:JDK 7及以前版本:HashMap是数组+链表结构(即为链地址法)

    JDK 8版本发布以后:HashMap是数组+链表+红黑树实现。

    5. 那么HashMap什么时候进行扩容和树形化呢?

    答:当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数 size)*loadFactor 时 , 就会进行数组扩容 , loadFactor 的默认 值 (DEFAULT_LOAD_FACTOR)为0.75,这是一个折中的取值。也就是说,默认 情况下,数组大小(DEFAULT_INITIAL_CAPACITY)为16,那么当HashMap中 元素个数超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值) 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元 素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知 HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。

    当HashMap中的其中一个链的对象个数如果达到了8个,此时如果capacity没有 达到64,那么HashMap会先扩容解决,如果已经达到了64,那么这个链会变成 树,结点类型由Node变成TreeNode类型。当然,如果当映射关系被移除后, 下次resize方法时判断树的结点个数低于6个,也会把树再转为链表。

  • 相关阅读:
    简述三范式
    Java反射,动态代理。笔记
    HJ20 密码验证合格程序--Javascript V8
    AB包中的Lua文件应该怎么require
    埃隆·马斯克旗下xAI推出PromptIDE工具,加速提示工程和可解释性研究
    八、QOS队列调度与报文丢弃
    对数据去趋势处理方法
    云数据库与Mysq连接超详细版+报错解决方案+团队使用
    基于文化优化算法图像量化(Matlab代码实现)
    【Linux】基础IO
  • 原文地址:https://blog.csdn.net/weixin_51612062/article/details/126329076