首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

2024年java面试准备--集合篇

),查询慢增删快,它是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的顺序所以遍历的时候会按照添加时的顺序来访问。...(1)如果key相同,则覆盖原始值; (2)如果key不同(出现冲突),则将当前的key-value放入链表中 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。...在并发访问时,ConcurrentHashMap 使用了 volatile 和 CAS 等机制来保证数据的一致性和可见性,所以可以保证多个线程同时访问时不会出现数据竞争和不一致的情况。...是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fast 机制。...该队列不允许使用 null 元素也不允许插入不可比较的对象 PriorityQueue 队列的头指排序规则最小那个元素。如果多个元素都是最小值则随机选一个。

40631

Java集合类常见面试知识点总结

4 除此之外,1.8jdk改进了hashmap,当链表上的元素个数超过8个时自动转化成红黑树,节点变成树节点,以提高搜索效率和插入效率到logn。...7 最后有一个比较冷门的知识点,hashmap1.7版本链表使用的是节点的头插法,扩容时转移链表仍然使用头插法,这样的结果就是扩容后链表会倒置,而hashmap.1.8在插入时使用尾插法,扩容时使用头插法...所以chm需要维护多个segment,每个segment对应一段数组。分段锁使用的是reetreetlock可重入锁实现,查询时不加锁。...用来保持顺序,可以使用它实现lru缓存,当访问命中时将节点移到队头,当插入元素超过长度时,删除队尾元素即可。...当然可能还有一些遗漏,但是大部分我在面试中能遇到的问题都已经包含进去了。

57521
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java集合类常见面试知识点总结

    4 除此之外,1.8jdk改进了hashmap,当链表上的元素个数超过8个时自动转化成红黑树,节点变成树节点,以提高搜索效率和插入效率到logn。...7 最后有一个比较冷门的知识点,hashmap1.7版本链表使用的是节点的头插法,扩容时转移链表仍然使用头插法,这样的结果就是扩容后链表会倒置,而hashmap.1.8在插入时使用尾插法,扩容时使用头插法...所以chm需要维护多个segment,每个segment对应一段数组。分段锁使用的是reetreetlock可重入锁实现,查询时不加锁。...用来保持顺序,可以使用它实现lru缓存,当访问命中时将节点移到队头,当插入元素超过长度时,删除队尾元素即可。...当然可能还有一些遗漏,但是大部分我在面试中能遇到的问题都已经包含进去了。

    55931

    Java集合类常见面试知识点总结

    4 除此之外,1.8jdk改进了hashmap,当链表上的元素个数超过8个时自动转化成红黑树,节点变成树节点,以提高搜索效率和插入效率到logn。...7 最后有一个比较冷门的知识点,hashmap1.7版本链表使用的是节点的头插法,扩容时转移链表仍然使用头插法,这样的结果就是扩容后链表会倒置,而hashmap.1.8在插入时使用尾插法,扩容时使用头插法...所以chm需要维护多个segment,每个segment对应一段数组。分段锁使用的是reetreetlock可重入锁实现,查询时不加锁。...用来保持顺序,可以使用它实现lru缓存,当访问命中时将节点移到队头,当插入元素超过长度时,删除队尾元素即可。...当然可能还有一些遗漏,但是大部分我在面试中能遇到的问题都已经包含进去了。

    30600

    java 集合框架

    链表中删除和增加比较快,因为可以直接通过修改链表的指针(Java中并无指针,这里可以简单理解为指针。其实是通过Node节点中的变量指定)进行元素的增删。...HashSet具有以下特点: 不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也可能发生变化; HashSet不是同步的; 集合元素值可以是null; 内部存储机制: 当向HashSet集合中存入一个元素时...值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说当遍历集合LinkedHashSet集合里的元素时,集合将会按元素的添加顺序来访问集合里的元素。...LinkedHashMap LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的,也可以在构造时带参数...(Collection c, Object o),统计元素出现次数 int indexOfSubList(List list, List target), 统计targe在list中第一次出现的索引,

    75120

    Java常用集合List、Map、Set介绍以及一些面试问题

    Set(无序、不能重复) Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。...在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)...LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。...,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。...排序方式 TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,重写compareTo方法。这种方式也称为元素的自然顺序,也叫元素的默认顺序。

    1.5K11

    Java集合总结

    image.png D、数组扩容: 从上面介绍的向ArrayList中存储元素的代码中,我们看到,每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容...容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。...所以,性能考虑,HashMap中的链表出现越少,性能才会越好。 将对向放入到HashMap或HashSet中时,有两个方法需要特别关心:A、hashCode()和equals()。...所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个操作也会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置...2、LinkedHashMap (1)继承自HashMap (2)能够按插入的顺序进行遍历。 (3)内部使用双向链表实现。默认按插入元素的顺序排序,也可以更换成按照访问顺序排序。

    65422

    Java面试题:Java中的集合及其继承关系

    集合中的对象不按特定的方式排序,并且没有重复对象。...LinkedList(): 在实现中采用链表数据结构。插入和删除速度快,访问速度慢。...6、LinkedHashMap和PriorityQueue的区别 PriorityQueue 是一个优先级队列,保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序...当遍历一个 PriorityQueue 时,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。 7、WeakHashMap与HashMap的区别是什么?...当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放

    1.3K00

    【进击面试_01】Java 集合

    数组的缺点是每个元素之间不能有间隔,当数组大小不满足需要扩容时,就要将旧的数组复制到新的数组中。当从 ArrayList 的中间位置插入或者删除元素时,对数组进行复制、移动需要的代价比较高。...也就是说,当遍历 LinkedHashSet 集合里的元素时,LinkedHashSet 将会按元素的添加顺序来访问集合里的元素。   ...LinkedHashSet 需要维护元素的插入顺序,因此性能略低于 HashSet 的性能,但在迭代访问 Set 里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。...JDK1.8 中的 ConcurrentHashMap 选择了与 HashMap 相同的底层实现 数组 + 链表 + 红黑树;在锁的实现上,抛弃了原有的 Segment 分段锁,采用 CAS + synchronized...1.3.3 其他 Map ☞ TreeMap   TreeMap 实现了 SortedMap 接口,也就是说会按照 key 的大小顺序对 Map 中的元素进行排序,key 大小的评判可以通过其本身的自然顺序

    39410

    Java基础

    null,key为null时返回的hashCode值为0 存放元素无序 hash冲突时,1.8之前是插入链表头部,1.8中是插入链表尾部 增删改查时间复杂度都是O(1),牛牛牛 put元素 对key的hashCode...在1.8中元素的位置要么是在原位置,要么是在原位置再移动2次幂的位置 LinkedHashMap HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap元素插入的顺序,也就是无序...它是HashMap的子类,在HashMap数据结构的基础上,还维护着一个双向链表链接所有元素,这个链表定义了迭代顺序,同HashMap一样,key只可以有一个null,value可以有多个null 支持两种排序...:默认是元素插入的顺序;可以通过设置accessOrder=true来达到按访问顺序排序的效果,也就是访问一个元素之后,会将它放到尾部 遍历的时候,从head指针指向的节点开始遍历,一直到tail指向的节点...,默认情况下是元素的插入顺寻 在创建LinkedHashMap的时候,可以通过设置accessOrder=true来达到按访问顺序遍历LinkedHashMap的效果。

    59910

    java集合详解完整版(超详细)「建议收藏」

    在实际使用中,如果更新图时不需要保持图中元素的顺序,就使用HashMap,如果需要保持图中元素的插入顺序或者访问顺序,就使用LinkedHashMap,如果需要使图按照键值排序,就使用TreeMap。...HashMap:适用于Map中插入、删除和定位元素。 Treemap:适用于按自然顺序或自定义顺序遍历键(key)。 四、重点问题 (一)说说List,Set,Map三者的区别?...LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。...LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。...我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,在Map 中插入、删除和定位元素,HashMap 是最好的选择。 TreeMap取出来的是排序后的键值对。

    1K20

    java-集合

    中,在散列时如果产生“碰撞”,将采用“分离链接法”来处理“碰撞”:把“碰撞”的 HashEntry 对象链接成一个链表。...插入三个节点后桶的结构示意图: 注意:由于只能在表头插入,所以链表中节点的顺序和插入的顺序相反。...该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator进行排序,具体取决于使用的构造方法。...8时,链表转换成树结构;若桶中链表元素个数小于等于6时,树结构还原成链表。...假设一下,如果设计成链表个数超过8则链表转换成树结构,链表个数小于8则树结构转换成链表,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低。

    60810

    50道Java集合经典面试题(收藏版)

    值新增的一位是零还是1,如果是1这个元素在新数组中的位置,是原数组的位置加原数组长度,如果是零就插入到原数组中。...List 和 Set,Map 的区别 List 以索引来存取元素,有序的,元素是允许重复的,可以插入多个null。...写一段代码在遍历 ArrayList 时移除一个元素 因为foreach删除会导致快速失败问题,fori顺序遍历会导致重复元素没删除,所以正确解法如下: 第一种遍历,倒叙遍历删除 for(int i=list.size...jdk8时,不用重新计算hash,只用看看原来的hash值新增的一位是零还是1,如果是1这个元素在新数组中的位置,是原数组的位置加原数组长度,如果是零就插入到原数组中。...此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序(insert-order)或者是访问顺序,其中默认的迭代访问顺序就是插入顺序,即可以按插入的顺序遍历元素,这点和HashMap有很大的不同。

    88911

    Java集合泛型面试题(含答案)

    当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。...15、什么是TreeSet(二叉树) TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。...在覆写 compare()函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序 比较此对象与指定对象的顺序。...为了降低这部分的开销,在 Java8 中, 当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。 ?...是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。

    1.2K30

    Java集合面试题&知识点总结(下篇)

    HashMap 并发插入操作的是怎样导致数据结构混乱和形成环形链表的? 解答:在 HashMap 中,当元素数量超过容量与加载因子的乘积时,会触发扩容操作。...分段锁:在 ConcurrentHashMap 中,整个哈希表被分为多个段(Segment),每个段都有自己的锁。当需要更新哈希表时,只需要锁定相关的段,而不是整个哈希表。...双向链表:LinkedHashMap 在内部维护了一个双向链表,用于记录元素的插入顺序或者访问顺序。...排序:TreeMap 中的元素可以按照键的自然顺序进行排序,也可以在构造 TreeMap 时传入一个 Comparator 对象,按照自定义的顺序进行排序。...TreeSet 保证了所有的元素按照元素的顺序进行排序,无论是插入时的顺序如何。 以上就是 NavigableSet 的基本概念。它是用于创建可以进行导航的集合,提供了丰富的方法来操作排序后的元素。

    21820

    Java面试集锦(一)之Java集合

    为了降低这部分的开销,在 Java8 中,当链表中的元素超过了 8 个以后,会将链表转换为红黑树,在这些位置进行查找的时候可以降低时间复杂度为 O(logN)。...由于数组的长度有限,所以难免会出现不同的 Key 通过运算得到的 index 相同,这种情况可以利用链表来解决, 在并发环境下使用 HashMap 容易出现死循环。...并发场景发生扩容,调用 resize() 方法里的 rehash() 时,容易出现环形链表。这样当获取一个不存在的 key时,计算出的 index 正好是环形链表的下标时就会出现死循环。...LinkedHashMap:它的底层是继承于 HashMap 实现的,由一个双向链表所构成。 LinkedHashMap 的排序方式有两种: 根据写入顺序排序。 根据访问顺序排序。...其中根据访问顺序排序时,每次 get 都会将访问的值移动到链表末尾,这样重复操作就能得到一个按照访问顺序排序的链表。

    44010

    「Java面试题精华集」1w字的Java集合框架篇(2020最新版)附PDF版 !

    另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。...注意双向链表和双向循环链表的区别,下面有介绍到!) 插入和删除是否受元素位置的影响: ① ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。...② LinkedList 采用链表存储,所以对于add(E e)方法的插入,删除元素时间复杂度不受元素位置的影响,近似 O(1),如果是要在指定位置i插入和删除元素的话((add(int index,...无序性不等于随机性 ,无序性是指存储的数据在底层数组中并非按照数组索引的顺序添加 ,而是根据数据的哈希值决定的。 2、什么是不可重复性?...; TreeSet 底层使用红黑树,能够按照添加元素的顺序进行遍历,排序的方式有自然排序和定制排序。

    1.3K20

    2019秋招:460道Java后端面试高频题答案版【模块二:Java集合类】

    LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。...LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序。 2、ArrayList 和 LinkedList 的区别?...当我们想往一个 HashMap 中添加一对 key-value 时,系统首先会计算 key 的 hash 值,然后根据 hash 值确认在 table 中存储的位置。若该位置没有元素,则直接插入。...LinkedHashMap 通过继承 hashMap 中的 Entry,并添加两个属性 Entry before,after 和 header 结合起来组成一个双向链表,来实现按插入顺序或访问顺序排序。...一般情况下,不必指定排序模式,其迭代顺序即为默认为插入顺序。 20、Iterator 怎么使用?有什么特点?

    59230

    彻底服了:HashMap 夺命二十一问,顶不住了!

    * loadfactor 时,容器会进行扩容resize 为 2n); 3、 i.如果 K 的 hash 值在 HashMap 中不存在,则执行插入,若存在,则发生碰撞; ii.如果 K 的 hash...如果 K 的 hash 值在 HashMap 中存在,且它们两者 equals 返回 false,则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。...(桶的数量必须大于64,小于64的时候只会扩容) 2、 发生hash碰撞时,java 1.7 会在链表的头部插入,而java 1.8会在链表的尾部插入 3、 在java 1.8中,Entry被Node替代...HashMap:在 Map 中插入、删除和定位元素时;TreeMap:在需要按自然顺序或自定义顺序遍历键的情况下;LinkedHashMap:在需要输出的顺序和输入的顺序相同的情况下。...HashTable 使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞; ConcurrentHashMap JDK 1.7 中使用分段锁(ReentrantLock + Segment

    44620

    这21个刁钻的HashMap面试题,我把阿里面试官吊打了

    如果 K 的 hash 值在 HashMap 中存在,且它们两者 equals 返回 false,则插入链表的尾部(尾插法)或者红黑树中(树的添加方式)。...发生hash碰撞时,java 1.7 会在链表的头部插入,而java 1.8会在链表的尾部插入 在java 1.8中,Entry被Node替代(换了一个马甲)。...LinkedHashMap 保存了记录的插入顺序,在用 Iterator 遍历时,先取到的记录肯定是先插入的;遍历比 HashMap 慢; TreeMap 实现 SortMap 接口,能够把它保存的记录根据键排序...HashMap:在 Map 中插入、删除和定位元素时; TreeMap:在需要按自然顺序或自定义顺序遍历键的情况下; LinkedHashMap:在需要输出的顺序和输入的顺序相同的情况下。...HashTable 使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞; ConcurrentHashMap JDK 1.7 中使用分段锁(ReentrantLock + Segment

    2.4K21
    领券