MST

星途 面试题库

面试题:Java中Set集合去重原理及常见实现方式

在Java中,Set集合的主要特性是元素的唯一性。请阐述Set集合是如何实现元素去重的?以HashSet为例,说明其去重的具体原理。另外,除了HashSet,还有哪些常见的Set集合实现类,它们在去重机制上有什么不同?
15.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

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