Java集合面试(看这一篇就够了)

集合共分为两大分支:Collection和Map
在这里插入图片描述
Collection接口下有List-列、Set-集、Queue-队子接口,集合侧重于效率而非安全;
List接口下有ArrayList、LinkedList和Vector实现类;
ArrayList,LinkedList和Vector有什么区别?
1、ArrayList和Vector本质都是用数组实现的,而LinkedList是用双链表实现的。
2、ArrayList是线程不安全的,Vector是线程安全的。
关于扩容:扩容的代价很高,所以能确定容量范围时尽量指定,只有ArrayList和Vector可以指定。
在添加数据时:
List有序可重复,Set无序不重复!

list集合如何去重?

Set接口下有HashSet和TreeSet实现类,HashSet下有LinkedHashSet子类;
由于HashSet的内部实现原理基于HashMap,所以先介绍Map集合,然后介绍Collection集合。
1、HashSet是哈希表实现的,HashSet中的数据是无序不可重复的,可以放入null
2、TreeSet是二叉树实现的,Treeset中的数据是自动排好序的,不允许放入null值
3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,首先通过equals方法比较是否具有相同内容的
String对象,然后比较hashcode是否一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例。
LinkedHashSet添加数据不重复,先进先出,非线程安全效率高

Map接口下有HashMap和Hashtable实现类;
聊起来map集合,不得不聊的是map集合的几种遍历方式:
Java Map集合的几种遍历方式与性能对比(包含lambda表达式)
HashMap类下有LinkedHashMap子类;
HashMap和Hashtable有什么区别?
(1).HashMap:线程不安全效率高,key、value值均可为null,所以优先使用HashMap。
线 \color{#FF0000}{拓展:开发中在不强调线程安全情况下,优先效率;}
例如:优先使用StringBuilder,多线程环境下要求线程安全优先使用StringBuffer
(2).Hashtable:线程安全效率低,key、value值均不可为null,而且查看源码发现其内部是通过sychronized实现的。
(3).多线程环境下,通常用HashMap和Collections工具类一起使用实现线程安全,HashMap的线程同步: Collections.synchronizedMap(map);
(4).两者的的key值均不能重复,若添加相同key的键值对,后面的value会自动覆盖前面的value,但不会报错。
H a s h M a p e n t r y s e t \color{#FF0000}{HashMap的四种遍历方式第一种entryset方式效率最高。}
HashMap的按值排序
1.将map集合转成一个LinkedList集合
2.用Collections的sort方法排序list集合
3.将排序后的list赋值给LinkedHashMap
HashMap中value值去重:
实现方法:将HashMap中的key-value对调,然后赋值给一个新的HashMap集合,此时由于key唯一可以把重复的值去掉,然后再把key-value对调放入另一个新的HashMap集合中。

jdk1.8中HashMap为什么当链表长度大于等于8时会转成红黑树?
链表个数多了转成红黑树 可以加快查找速度;
游戏开发中数组应用特别多,要求效率、时效性高。

内部实现原理
哈希表:由数组和链表组成,HashMap底层实现是基于哈希表。
Hash碰撞:不同的key通过hash算法算出来的值有可能一样,这就是hash碰撞。

发布了134 篇原创文章 · 获赞 32 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/yang_guang3/article/details/104320776