Java集合面试之Set篇
有 List 了为什么还要有 Set?Java 容器 Set 的核心通关指南
主要有HashSet、LinkedHashSet、TreeSet
HashSet
(无序,唯一): 基于HashMap
实现的,底层采用HashMap
来保存元素LinkedHashSet
:LinkedHashSet
是HashSet
的子类,并且其内部是通过LinkedHashMap
来实现的。有点类似于我们之前说的LinkedHashMap
其内部是基于HashMap
实现一样,不过还是有一点点区别的TreeSet
(有序,唯一): 红黑树(自平衡的排序二叉树)
1、HashSet 的实现原理?
HashSet 是基于HashMap
实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为静态对象PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。
2、HashSet如何保证唯一性?
1).HashSet底层数据结构是哈希表,哈希表就是存储唯一系列的表,而哈希值是由对象的hashCode()方法生成。
2).确保唯一性的两个方法:hashCode()
和equals()
方法。
3、LinkedHashSet如何保证有序和唯一性?
1).底层数据结构由哈希表和链表组成。
2).链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性。
4、TreeSet如何保证元素的排序和唯一性?
底层的数据结构是红黑树(一种自平衡二叉查找树)。
JDK 1.8中为什么HashMap使用红黑树而不是普通的AVL树
5、HashSet、TreeSet 和 LinkedHashSet 三种类型什么时候使用它们?
(1)HashSet中不能有相同的元素,可以有一个Null元素,存入的元素是无序的。
(2)LinkedHashSet中不能有相同元素,可以有一个Null元素,元素严格按照放入的顺序排列。
(3)TreeSet是中不能有相同元素,不可以有Null元素,根据元素的自然顺序进行排序。
无排序要求可以选用HashSet;想取出元素的顺序和放入元素的顺序相同,那么可以选用LinkedHashSet。想插入、删除立即排序或者按照一定规则排序可以选用TreeSet。
6、HashSet 和 LinkedHashSet 判定元素重复的原则是相同的?
是的,会先去执行 hashCode()
方法,判断是否重复。如果 hashCode()
返回值相同,就会去判断 equals
方法。如果equals()
方法还是相同,那么就认为重复。
7、TreeSet 判断元素重复原则?
TreeSet
的元素必须是实现了 java.lang.Comparable<T>
接口,所以他是根据此接口的方法 compareTo
方法进行判断重复的,当返回值一样的时认定重复。
8、怎么实现一个线程安全的 hashset?
Collections.synchronizedSet()
or
CopyOnWriteArraySet
9、CopyOnWriteArraySet 的实现?
是一个支持并发访问的容器,CopyOnWriteArraySet是借助CopyOnWriteArrayList实现的,只不过CopyOnWriteArraySet是在CopyOnWriteArrayList上使用indexOf
不允许存入重复元素。
10、EnumSet是什么?
是枚举类型的集合实现。是不同步的,不允许值为null的元素。
11、HashSet和TreeSet的区别两者主要在实现方式、数据是否有序以及是否可以放入null值等三方面存在区别?
一、实现方式
- HashSet是哈希表实现的。
- TreeSet是二叉树实现的。
二、数据是否有序
- HashSet中的数据是无序的。
- TreeSet中的数据是自动排好序的。
三、是否可以放入null值
- HashSet可以放入null,但只能放入一个null。
- TreeSet不允许放入null值。