面试题答案
一键面试- Set集合实现元素去重的方式:
- Set集合通过
equals()
方法和hashCode()
方法来实现元素去重。当向Set集合中添加元素时,Set首先会调用元素的hashCode()
方法获取其哈希码,根据哈希码计算元素在集合中的存储位置。如果该位置没有元素,就直接添加。如果该位置已有元素,再调用equals()
方法比较这两个元素是否相等。如果相等,则不添加新元素;如果不相等,则以某种方式(如链表法解决哈希冲突)将新元素存储在该位置。
- Set集合通过
- HashSet去重的具体原理:
- 计算哈希码:当调用
HashSet
的add
方法添加元素时,首先调用元素的hashCode()
方法获取哈希码值。例如,假设元素为obj
,则调用obj.hashCode()
。 - 确定存储位置:根据哈希码值,通过特定的哈希算法(如
hash & (table.length - 1)
,这里hash
是哈希码值,table
是HashSet
内部存储元素的数组)计算出元素在哈希表中的存储位置。 - 冲突处理及去重:如果该位置为空,直接将元素放入该位置。如果该位置已有元素,就调用新元素和该位置元素的
equals()
方法进行比较。若equals()
方法返回true
,说明两个元素相等,不添加新元素;若返回false
,则说明两个元素不相等,HashSet
会采用链表法(JDK 1.8之前)或红黑树法(JDK 1.8及之后,当链表长度达到一定阈值时会转换为红黑树)来处理冲突,将新元素存储在该位置的链表或红黑树中。
- 计算哈希码:当调用
- 其他常见Set集合实现类及去重机制差异:
- TreeSet:
- 去重机制:
TreeSet
是基于红黑树实现的有序Set集合。它去重依赖于元素的自然顺序(元素实现Comparable
接口)或自定义的比较器(创建TreeSet
时传入Comparator
)。当添加元素时,TreeSet
会根据比较规则将元素插入到合适的位置。如果比较结果认为新元素与已有的某个元素相等(compareTo
或compare
方法返回0),则不添加新元素。 - 与HashSet区别:
HashSet
是无序的,主要通过哈希码和equals
方法去重;而TreeSet
是有序的,通过元素的比较来决定是否重复,且比较规则更为灵活,可以基于自然顺序或自定义比较器。
- 去重机制:
- LinkedHashSet:
- 去重机制:
LinkedHashSet
继承自HashSet
,并维护了一个双向链表来记录元素插入的顺序。它的去重机制和HashSet
基本相同,也是通过hashCode()
和equals()
方法。但由于维护了链表结构,它能保证元素的插入顺序。 - 与HashSet区别:
HashSet
不保证元素的顺序,而LinkedHashSet
保证元素按照插入顺序或访问顺序(如果开启了访问顺序模式)存储,在去重的基础上增加了顺序性的特点。
- 去重机制:
- TreeSet: