![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
集合类面试题
集合类面试题
Mr.Aholic
爱好敲代码、多多少少都懂点、也不精通。喜欢旅游,已经旅游的城市地点:河南老家、广州、佛山、深圳、上海、山西、长沙、张家界、武汉、新疆-乌鲁木齐、新疆-吐鲁番,郑州等。备考明年的 高级系统分析师 和 系统架构师【2022届毕业生---软件工程专业】
展开
-
【Java集合类面试三十】、BlockingQueue中有哪些方法,为什么这样设计?
为了应对不同的业务场景,BlockingQueue 提供了4 组不同的方法用于插入、移除以及对队列中的元素进行检查。如果请求的操作不能得到立即执行的话,每组方法的表现是不同的。超时:如果操作无法立即执行,则该方法调用将会发生阻塞,直到能够执行。但等待时间不会超过给定值,并返回一个特定值以告知该操作是否成功(典型的是true / false)。特定值:如果操作无法立即执行,则返回一个特定的值(一般是 true / false)。阻塞:如果操作无法立即执行,则该方法调用将会发生阻塞,直到能够执行;原创 2023-10-26 08:25:34 · 196 阅读 · 0 评论 -
【Java集合类面试二十九】、说一说HashSet的底层结构
HashSet是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。它封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。原创 2023-10-26 08:21:26 · 105 阅读 · 0 评论 -
【Java集合类面试二十八】、说一说TreeSet和HashSet的区别
主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。2、HashSet不能保证元素的排列顺序,而TreeSet支持自然排序、定制排序两种排序的方式;1、HashSet中的元素可以是null,但TreeSet中的元素不能是null;3、HashSet底层是采用哈希表实现的,而TreeSet底层是采用红黑树实现的。原创 2023-10-25 23:26:58 · 213 阅读 · 1 评论 -
【Java集合类面试二十七】、谈谈CopyOnWriteArrayList的原理
优点:读操作性能很高,因为无需任何同步措施,比较适用于读多写少的并发场景。而CopyOnWriteArrayList由于其实现策略的原因,写和读分别作用在新老不同容器上,在写操作执行过程中,读不会阻塞但读取到的却是老容器的数据。而写操作的时候,则首先将容器复制一份,然后在新的副本上执行写操作,这个时候写操作是上锁的。注意,在上锁执行写操作的过程中,如果有需要读操作,会作用在原容器上。正如其名字一样,在写操作时会复制一份新的List,在新的List上完成写操作,然后再将原引用指向新的List。原创 2023-10-25 23:24:48 · 175 阅读 · 0 评论 -
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList的底层是用数组来实现的,默认第一次插入元素时创建大小为10的数组,超出限制时会增加50%的容量,并且数据以 System.arraycopy() 复制到新的数组,因此最好能给出数组大小的预估值。按数组下标访问元素的性能很高,这是数组的基本优势。直接在数组末尾加入元素的性能也高,但如果按下标插入、删除元素,则要用 System.arraycopy() 来移动部分受影响的元素,性能就变差了,这是基本劣势。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。利己利人、所谓双赢。原创 2023-10-25 23:23:30 · 251 阅读 · 0 评论 -
【Java集合类面试二十五】、有哪些线程安全的List?
当线程对此类集合执行写入操作时,集合会在底层复制一份新的数组,接下来对新的数组执行写入操作。由于对集合的写入操作都是对数组的副本执行操作,因此它是线程安全的。SynchronizedList是Collections的内部类,Collections提供了synchronizedList方法,可以将一个线程不安全的List包装成线程安全的List,即SynchronizedList。它比Vector有更好的扩展性和兼容性,但是它所有的方法都带有同步锁,也不是性能最优的List。有兴趣的可以关注一下。原创 2023-10-25 23:22:16 · 376 阅读 · 0 评论 -
【Java集合类面试二十四】、ArrayList和LinkedList有什么区别?
2、对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N);4、LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。有兴趣的可以关注一下。1、ArrayList的实现是基于数组,LinkedList的实现是基于双向链表;原创 2023-10-25 23:20:52 · 152 阅读 · 0 评论 -
【Java集合类面试二十三】、List和Set有什么区别?
主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。List代表有序的,元素可以重复的集合。Set代表无序的,元素不可重复的集合;原创 2023-10-25 23:19:35 · 153 阅读 · 0 评论 -
【Java集合类面试二十二】、Map和Set有什么区别?
主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。Map代表具有映射关系(key-value)的集合,其所有的key是一个Set集合,即key无序且不能重复。Set代表无序的,元素不可重复的集合;原创 2023-10-25 23:18:29 · 155 阅读 · 0 评论 -
【Java集合类面试二十一】、请介绍TreeMap的底层原理
TreeMap包含几个重要的成员变量:root、size、comparator。它是Entry类型,Entry是红黑树的节点,它包含了红黑树的6个基本组成:key、value、left、right、parent和color。Entry节点根据根据Key排序,包含的内容是value。映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。TreeMap的基本操作containsKey、get、put、remove方法,它的时间复杂度是log(N)。原创 2023-10-25 23:17:23 · 143 阅读 · 0 评论 -
【Java集合类面试二十】、请介绍LinkedHashMap的底层原理
LinkedHashMap继承于HashMap,它在HashMap的基础上,通过维护一条双向链表,解决了HashMap不能随时保持遍历顺序和插入顺序一致的问题。在实现上,LinkedHashMap很多方法直接继承自HashMap,仅为维护双向链表重写了部分方法。如下图,淡蓝色的箭头表示前驱引用,红色箭头表示后继引用。每当有新的键值对节点插入时,新节点最终会接在tail引用指向的节点后面。而tail引用则会移动到新的节点上,这样一个双向链表就建立起来了。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。原创 2023-10-25 08:37:06 · 216 阅读 · 0 评论 -
【Java集合类面试十九】、说一说你对LinkedHashMap的理解
LinkedHashMap可以避免对HashMap、Hashtable里的key-value对进行排序(只要插入key-value对时保持顺序即可),同时又可避免使用TreeMap所增加的成本。LinkedHashMap使用双向链表来维护key-value对的顺序(其实只需要考虑key的顺序),该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序保持一致。但因为它以链表来维护内部顺序,所以在迭代访问Map里的全部元素时将有较好的性能。主要分享开发知识、学习资料、毕业设计指导等。原创 2023-10-25 08:35:42 · 86 阅读 · 0 评论 -
【Java集合类面试十八】、ConcurrentHashMap是怎么分段分组的?
Segment的get操作实现非常简单和高效,先经过一次再散列,然后使用这个散列值通过散列运算定位到 Segment,再通过散列算法定位到元素。get操作的高效之处在于整个get过程都不需要加锁,除非读到空的值才会加锁重读。原因就是将使用的共享变量定义成 volatile 类型。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。2、定位到添加元素的位置,将其放入 HashEntry 数组中。1、判断是否需要扩容;原创 2023-10-25 08:34:37 · 124 阅读 · 0 评论 -
【Java集合类面试十七】、介绍一下ConcurrentHashMap是怎么实现的?
在 jdk 1.7 中,ConcurrentHashMap 是由 Segment 数据结构和 HashEntry 数组结构构成,采取分段锁来保证安全性。JDK1.8 的实现已经摒弃了 Segment 的概念,而是直接用 Node 数组+链表+红黑树的数据结构来实现,并发控制使用 Synchronized 和 CAS 来操作,整个看起来就像是优化过且线程安全的 HashMap,虽然在 JDK1.8 中还能看到 Segment 的数据结构,但是已经简化了属性,只是为了兼容旧版本。有兴趣的可以关注一下。原创 2023-10-24 23:42:15 · 138 阅读 · 0 评论 -
【Java集合类面试十六】、HashMap与ConcurrentHashMap有什么区别?
Collections工具类可以将一个Map转换成线程安全的实现,其实也就是通过一个包装类,然后把所有功能都委托给传入的Map,而包装类是基于synchronized关键字来保证线程安全的(Hashtable也是基于synchronized关键字),底层使用的是互斥锁,性能与吞吐量比较低。它没有使用一个全局锁来锁住自己,而是采用了减少锁粒度的方法,尽量减少因为竞争锁而导致的阻塞与冲突,而且ConcurrentHashMap的检索操作是不需要锁的。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。原创 2023-10-24 23:38:23 · 32 阅读 · 0 评论 -
【Java集合类面试十五】、说一说HashMap和HashTable的区别
从Hashtable的类名上就可以看出它是一个古老的类,它的命名甚至没有遵守Java的命名规范:每个单词的首字母都应该大写。与Vector类似的是,尽量少用Hashtable实现类,即使需要创建线程安全的Map实现类,也无须使用Hashtable实现类,可以通过Collections工具类把HashMap变成线程安全的Map。主要分享开发知识、学习资料、毕业设计指导等。1、Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点。原创 2023-10-23 20:20:25 · 85 阅读 · 0 评论 -
【Java集合类面试十四】、HashMap是如何解决哈希冲突的?
为了解决碰撞,数组中的元素是单向链表类型。当链表长度到达一个阈值时,会将链表转换成红黑树提高性能。而当链表长度缩小到另一个阈值时,又会将红黑树转换回单向链表提高性能。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。原创 2023-10-23 20:17:22 · 91 阅读 · 0 评论 -
【Java集合类面试十三】、HashMap如何实现线程安全?
主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。3、使用Collections将HashMap包装成线程安全的Map。2、直接使用ConcurrentHashMap;1、直接使用Hashtable类;原创 2023-10-23 20:15:55 · 127 阅读 · 0 评论 -
【Java集合类面试十二】、HashMap为什么线程不安全?
主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。HashMap在并发执行put操作时,可能会导致形成循环链表,从而引起死循环。原创 2023-10-23 20:14:11 · 48 阅读 · 0 评论 -
【Java集合类面试十一】、HashMap为什么用红黑树而不用B树?
HashMap本来是数组+链表的形式,链表由于其查找慢的特点,所以需要被查找效率更高的树结构来替换。如果用B/B+树的话,在数据量不是很多的情况下,数据都会“挤在”一个结点里面,这个时候遍历效率就退化成了链表。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。B/B+树多用于外存上时,B/B+也被成为一个磁盘友好的数据结构。原创 2023-10-23 20:11:37 · 391 阅读 · 0 评论 -
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程的情况下,当重新调整HashMap大小的时候,就会存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历。如果条件竞争发生了,那么就会产生死循环了。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。原创 2023-10-23 20:10:03 · 178 阅读 · 0 评论 -
【Java集合类面试九】、介绍一下HashMap的扩容机制
因此,我们在扩充HashMap的时候,不需要重新计算hash,只需要看看原来的hash值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引+oldCap”。2、数组是否需要扩充是通过负载因子判断的,如果当前元素个数为数组容量的0.75时,就会扩充数组。这个设计确实非常的巧妙,既省去了重新计算hash值的时间,而且同时,由于新增的1bit是0还是1可以认为是随机的,因此resize的过程,均匀的把之前的冲突的节点分散到新的bucket了。主要分享开发知识、学习资料、毕业设计指导等。原创 2023-10-23 20:05:41 · 500 阅读 · 0 评论 -
【Java集合类面试八】、 介绍一下HashMap底层的实现原理
存储对象时,我们将K/V传给put方法时,它调用K的hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。有兴趣的可以关注一下。原创 2023-10-23 20:02:45 · 181 阅读 · 0 评论 -
【Java集合类面试七】、 JDK7和JDK8中的HashMap有什么区别?
来实现的,它的底层维护一个Node数组。当链表的存储的数据个数大于等于8的时候,不再采用链表存储,而采用了红黑树存储结构。来实现的,它的底层维护一个Entry数组。它会根据计算的hashCode将对应的KV键值对存储到该数组中,一旦发生hashCode冲突,那么就会将该KV键值对放到对应的已有元素的后面, 此时便形成了一个链表式的存储结构。JDK7中HashMap的实现方案有一个明显的缺点,即当Hash冲突严重时,在桶上形成的链表会变得越来越长,这样在查询时的效率就会越来越低,其时间复杂度为O(N)。原创 2023-10-23 20:01:41 · 172 阅读 · 0 评论 -
【Java集合类面试六】、 HashMap有什么特点?
主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。2、HashMap可以使用null作为key或value。1、HashMap是线程不安全的实现;原创 2023-10-23 20:00:10 · 175 阅读 · 0 评论 -
【Java集合类面试五】、 如何得到一个线程安全的Map?
主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。2、使用java.util.concurrent包下的Map,如ConcurrentHashMap;3、不建议使用Hashtable,虽然Hashtable是线程安全的,但是性能较差。1、使用Collections工具类,将线程不安全的Map包装成线程安全的Map;原创 2023-10-23 19:59:03 · 69 阅读 · 0 评论 -
【Java集合类面试四】、 描述一下Map put的过程
主要分享开发知识、学习资料、毕业设计指导等。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。如果数组中元素个数(size)超过threshold,则再次进行扩容操作。先判断数组是否为空,若数组为空则进行第一次扩容(resize);如果当前位置元素非空,且key已存在,则直接覆盖其value;如果当前位置元素非空,且key不存在,则将数据链到链表末端;若链表长度达到8,则将链表转换成红黑树,并将数据插入树中;通过hash算法,计算键值对在数组中的索引;如果当前位置元素为空,则直接插入数据;原创 2023-10-23 19:57:00 · 276 阅读 · 0 评论 -
【Java集合类面试三】、Map接口有哪些实现类?
如果需要保证线程安全,则可以使用ConcurrentHashMap。它的性能好于Hashtable,因为它在put时采用分段锁/CAS的加锁机制,而不是像Hashtable那样,无论是put还是get都做同步处理。对于需要排序的场景,如果需要按插入顺序排序则可以使用LinkedHashMap,如果需要将key按自然顺序排列甚至是自定义顺序排列,则可以选择TreeMap。Map接口有很多实现类,其中比较常用的有HashMap、LinkedHashMap、TreeMap、ConcurrentHashMap。原创 2023-10-23 16:59:06 · 49 阅读 · 0 评论 -
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
java.util包下的集合类大部分都是线程不安全的,例如我们常用的HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap,这些都是线程不安全的集合类,但是它们的优点是性能好。java.util包下也有线程安全的集合类,例如Vector、Hashtable。所以即便是需要使用线程安全的集合类,也建议将线程不安全的集合类包装成线程安全集合类的方式,而不是直接使用这些古老的API。踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。原创 2023-10-23 16:58:01 · 84 阅读 · 0 评论 -
【Java集合类面试一】、 Java中有哪些容器(集合类)?
Java中的集合类主要由Collection和Map这两个接口派生而出,其中Collection接口又派生出三个子接口,分别是Set、List、Queue。所有的Java集合类,都是Set、List、Queue、Map这四个接口的实现类,这四个接口将集合分成了四大类,其中。这些接口拥有众多的实现类,其中最常用的实现类有HashSet、TreeSet、ArrayList、LinkedList、ArrayDeque、HashMap、TreeMap等。注:紫色框体代表接口,其中加粗的是代表四类集合的接口。原创 2023-10-23 16:54:58 · 138 阅读 · 0 评论