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 +
'}';
}
}
备注: 关注站长获取更多详情。
- 本文标签: Java 面试题
- 本文链接: https://www.jietongc.com/article/331
- 版权声明: 本文由大熊科技原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权