• Java常见面试题21-30(集合类)


     分享第二个励志话语

    所有的努力,不是为了让别人觉得你了不起,而是为了能让自己打心里看得起自己,人生的奔跑,不在于瞬间的爆发,取决于途中的坚持,你纵有千百个理由放弃,也要找一个理由坚持,能激励你,温暖你,感动你的,不是励志语录心灵鸡汤,而是身边比你优秀的人比你还努力!自勉!

    Java面试题第三版新鲜出炉喽! 

    目录

    21.HashMap的工作原理是什么?

    22.HashMap与HashTable的区别是什么?

    23.CorrentHashMap的工作原理?

    24.遍历一个List有哪些不同的方式?

    25.fail-fast与fail-safe有什么区别?

    26.Array和ArrayList有何区别?什么时候更适合用Array?

    27.哪些集合类提供对元素的随机访问?

    29.LinkedHashMap的实现原理?

    30.LinkedList和ArrayList的区别是什么?


     

    21.HashMap的工作原理是什么?

    HashMap内部是通过一个数组实现的,只是这个数组比较特殊,数组里存储的元素是一个Entry实体(jdk 8为Node),这个Entry实体主要包含key、value以及一个指向自身的next指针。HashMap是基于hashing实现的,当我们进行put操作时,根据传递的key值得到它的hashcode,然后再用这个hashcode与数组的长度进行模运算,得到一个int值,就是Entry要存储在数组的位置(下标);

    当通过get方法获取指定key的值时,会根据这个key算出它的hash值(数组下标),根据这个hash值获取数组下标对应的Entry,然后判断Entry里的key,hash值或者通过equals()比较是否与要查找的相同,如果相同,返回value,否则的话,遍历该链表(有可能就只有一个Entry,此时直接返回null),直到找到为止,否则返回null。

    HashMap之所以在每个数组元素存储的是一个链表,是为了解决hash冲突问题,当两个对象的hash值相等时,那么一个位置肯定是放不下两个值的,于是hashmap采用链表来解决这种冲突,hash值相等的两个元素会形成一个链表。

    22.HashMap与HashTable的区别是什么?

    1.HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的实现,它以最大限度地减少实现此接口所需的工作。(在java 8中我查看源码发现Hashtable并没有继承Dictionary,而且里面也没有同步方法,是不是java 8中Hashtable不在同步的了?有没有人解释一下?)

    2. HashMap的key和value都允许为null,而Hashtable的key和value都不允许为null。HashMap遇到key为null的时候,调用putForNullKey方法进行处理,而对value没有处理;Hashtable遇到null,直接返回NullPointerException。

    3. Hashtable是同步的,而HashMap是非同步的,但是我们也可以通过Collections.synchronizedMap(hashMap),使其实现同步。

    23.CorrentHashMap的工作原理?

    jdk 1.6版: ConcurrenHashMap可以说是HashMap的升级版,ConcurrentHashMap是线程安全的,但是与Hashtablea相比,实现线程安全的方式不同。Hashtable是通过对hash表结构进行锁定,是阻塞式的,当一个线程占有这个锁时,其他线程必须阻塞等待其释放锁。

    ConcurrentHashMap是采用分离锁的方式,它并没有对整个hash表进行锁定,而是局部锁定,也就是说当一个线程占有这个局部锁时,不影响其他线程对hash表其他地方的访问。

    具体实现: ConcurrentHashMap内部有一个Segment数组, 该Segment对象可以充当锁。Segment对象内部有一个HashEntry数组,于是每个Segment可以守护若干个桶(HashEntry),每个桶又有可能是一个HashEntry连接起来的链表,存储发生碰撞的元素。

    每个ConcurrentHashMap在默认并发级下会创建包含16个Segment对象的数组,每个数组有若干个桶,当我们进行put方法时,通过hash方法对key进行计算,得到hash值,找到对应的segment,然后对该segment进行加锁,然后调用segment的put方法进行存储操作,此时其他线程就不能访问当前的segment,但可以访问其他的segment对象,不会发生阻塞等待。

    jdk 1.8版 在jdk 8中,ConcurrentHashMap不再使用Segment分离锁,而是采用一种乐观锁CAS算法来实现同步问题,但其底层还是“数组+链表->红黑树”的实现。

    24.遍历一个List有哪些不同的方式?

    List strList = new ArrayList<>(); 

        //for-each

        for(String str:strList) {

            System.out.print(str);

        }

        

        //use iterator 尽量使用这种 更安全(fail-fast)

        Iterator it = strList.iterator();

        while(it.hasNext) {

            System.out.printf(it.next());

        }

    25.fail-fast与fail-safe有什么区别?

    Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。Java.util包中的所有集合类都被设计为fail->fast的,而java.util.concurrent中的集合类都为fail-safe的。当检测到正在遍历的集合的结构被改变时,Fail-fast迭代器抛出ConcurrentModificationException,而fail-safe迭代器从不抛出ConcurrentModificationException。

     

    26.Array和ArrayList有何区别?什么时候更适合用Array?

    Array可以容纳基本类型和对象,而ArrayList只能容纳对象。

    Array是指定大小的,而ArrayList大小是固定的

    27.哪些集合类提供对元素的随机访问?

    ArrayList、HashMap、TreeMap和HashTable类提供对元素的随机访问。

    28.HashSet的底层实现是什么?

    通过看源码知道HashSet的实现是依赖于HashMap的,HashSet的值都是存储在HashMap中的。在HashSet的构造法中会初始化一个HashMap对象,HashSet不允许值重复,因此,HashSet的值是作为HashMap的key存储在HashMap中的,当存储的值已经存在时返回false。

    29.LinkedHashMap的实现原理?

    LinkedHashMap也是基于HashMap实现的,不同的是它定义了一个Entry header,这个header不是放在Table里,它是额外独立出来的。LinkedHashMap通过继承hashMap中的Entry,并添加两个属性Entry before,after,和header结合起来组成一个双向链表,来实现按插入顺序或访问顺序排序。LinkedHashMap定义了排序模式accessOrder,该属性为boolean型变量,对于访问顺序,为true;对于插入顺序,则为false。一般情况下,不必指定排序模式,其迭代顺序即为默认为插入顺序。

    30.LinkedList和ArrayList的区别是什么?

    ArrayList是基于数组实现,LinkedList是基于链表实现

    ArrayList在查找时速度快,LinkedList在插入与删除时更具优势

    今天的分享到此结束了,我们寒窗苦读十余年,好像最后都是为了步入工作,人生每个阶段的追求都是不同的,我们无须迷茫,只要往前看就可以了,工作一定能找到,你所付出的努力,最后都会回报到你你身上,所以,请不要着急,慢慢来,我们一定都会达到自己喜欢的生活的,和爱的人结婚,过自己过的生活,慢慢来,不要急,一定会来

    加油未来,以及现在的程序猿们,我们的未来可期 

    创作不易点赞评论互关三连

     

     

     

  • 相关阅读:
    102.(前端)分类管理增加窗口显示——dialog弹窗的基本使用与在form表单显示变量
    一、Redis入门之——介绍、安装,图形化界面(GUI)工具Redis Desktop Manager (RDM)安装
    centos7安装mysql急速版
    基于紫光同创FPGA的图像采集及AI加速
    【MCU】栈溢出问题
    路由事件2
    Linux系统运维排故思路参考手册
    UI组件库Kendo UI for Vue原生组件中文教程 - 如何开始制作动画
    一端强制一端自协商会有问题吗
    (SVN+SSH)搭建SVN并使用SSH进行免密拉取推送代码
  • 原文地址:https://blog.csdn.net/swy2560666141/article/details/126930267