原创

java面试题-说说HashSet实现原理是什么?有什么特点?

1. HashSet的实现原理:

HashSet是基于HashMap实现的,它实际上是通过HashMap的key来实现的,将元素存储在HashMap的key部分,而value则使用一个固定的Object对象。

具体实现原理如下:

当我们往HashSet中添加元素时,实际上是调用了HashMap的put方法。HashSet中的元素将被添加到HashMap的key部分,而HashMap的value部分则使用一个固定的Object对象。HashSet通过HashMap的key唯一性来保证元素的唯一性。由于HashMap底层使用了哈希表数据结构,因此HashSet具有快速的查询速度。

2. HashSet的特点:

查询速度快: 由于HashSet底层采用HashMap实现,因此具有快速的查询速度。在大多数情况下,HashSet的查询性能是非常高效的。支持null值: 由于HashMap支持key为null值,因此HashSet也可以容纳null元素。在集合中,null元素只能存在一个,因为HashSet要保持元素的唯一性。自定义类的存储: 当存放自定义类对象时,需要保证这些对象重写了hashCode()equals()方法。这是因为HashSet通过这两个方法来判断元素的唯一性。具体判断逻辑可参考HashMap的put()方法,简单概括为:对key进行哈希,判断元素hash值是否相等,key是否为同一个对象,key是否equals。只要其中一个条件成立,HashSet就认为元素相同。

3. 无序且不可重复:

无序性: HashSet中的元素是无序的,即不会按照添加的顺序进行存储。这是因为HashSet并没有维护元素的插入顺序。不可重复性: HashSet保证集合中元素的唯一性。如果试图将一个已经存在的元素添加到HashSet中,添加操作将被忽略。

示例代码:

import java.util.HashSet;
public class HashSetExample { public static void main(String[] args) { // 创建HashSet HashSet<String> hashSet = new HashSet<>();
// 添加元素 hashSet.add("Apple"); hashSet.add("Banana"); hashSet.add("Orange"); hashSet.add(null); // 允许添加null值
// 打印HashSet System.out.println("HashSet: " + hashSet);
// 自定义类的示例 HashSet<Person> personSet = new HashSet<>(); personSet.add(new Person("John", 25)); personSet.add(new Person("Jane", 30)); personSet.add(new Person("John", 25)); // 重复元素将被忽略
// 打印自定义类的HashSet System.out.println("Person HashSet: " + personSet); }}
class Person { String name; int age;
public Person(String name, int age) { this.name = name; this.age = age; }
@Override public int hashCode() { return name.hashCode() + age; // 自定义hashCode方法 }
@Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person person = (Person) obj; return age == person.age && name.equals(person.name); // 自定义equals方法 }
@Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}


备注: 关注站长获取更多详情。

file
file
正文到此结束
本文目录