关于HashSet不可不知的几点要诀
Hashset:HashSet是Set接口的实现类,它有以下特点:
- 无重复.集合里没有重复的元素。这是通过HashCode查重实现的
- 无序.表现在
- 存储无序.无视add顺序
- 输出无序.无视print顺序
HashSet的使用
Code Snippet 1
import java.util.HashSet;
import java.util.Iterator;
import java.util.Objects;
public class Example1{
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add("1");
hs.add("1");
hs.add("dv");
Iterator it = hs.iterator();
while (it.hasNext()){
Object i = it.next();
System.out.println(i);
}
}
}
运行结果:
代码分析:通过new方式创建HashSet类的一个对象hs,使用hs的方法add()添加元素,这里的"1" 与 “dv” 属于标题类型的,由于在创建hs时为说明hs类型,所以系统默认泛化类型,因此对于String&Integer均可输入。接下来通过hs的iterator()方法创建迭代器it,利用while循环对hs进行打印。在while循环打印hs时,我们使用了局部变量 i 做为next()方法返回值的承接。和上面所说的泛化类型一样的是,这里的Object类也是一种泛化类型,它可以包含各种元素,如果在前面已经确定了HashSet 的类型,这里的Object当然就可以替换为选定的数据类型。值得注意的是,在添加元素的过程中,我们添加了两处"1",不过在打印过程中只有一个"1",这体现了HashSet无重复。
Code Snippet 2
import java.util.HashSet;
import java.util.Objects;
class Student{ //Student类
private String id;
private String name;
public Student(String id,String name){
this.id = id;
this.name = name;
}
public String toString(){ //toString方法是Object类的方法,默认继承
return id + ":" +name ;
}
public int hashCode(){
return id.hashCode();
}
public boolean equals(Object obj){ //重写equals方法
if(!(obj instanceof Student)){
return false;
}
if (this == obj){
return true;
}
Student stu = (Student) obj;
boolean b = this.id.equals(stu.id);
return b;
}
}
public class Example2 {
public static void main(String[] args) {
HashSet hs = new HashSet();
Student stu1 = new Student("1","张三");
Student stu2 = new Student("2","李四");
Student stu3 = new Student("2","李四");
hs.add(stu1);
hs.add(stu2);
hs.add(stu3);
System.out.println(hs);
}
}
运行结果:
代码分析:定义Student类,定义一系列静态方法,重写equals方法。equals方法是HashSet实现无重复的关键。使用equals方法需要传参,这里的Object当然也可以替换成实际类型。equals方法通过嵌套两个if语句来实现元素查重。 if(!(obj instanceof Student) 实现对元素种类相同这一前提的保证,因为这里的HashSet仅仅输入学生的相关信息,增强了代码的鲁健性;第二个if语句通过 == 比较实现元素的查重,需要注意的是Object类元素的比较是对于其引用位置的比较。 Student stu = (Student) obj; 代码实现了将两个输入的stu转化为同一类进行对比,最后再对于元素哈希值对比并返回结果。Main函数通过add()方法导入三个元素。在代码执行时,由于 stu1 与 stu2 均是 new 出的结果,所以它们的索引不同;不过由于哈希值一样,所以返回false,舍弃stu。
HashCode
哈希值(Hash Value)是根据数据内容通过哈希函数计算得到的固定长度的整数值。它也被称为哈希码(Hash Code)或散列值(Hash Value)。
哈希函数是一种将任意大小的数据映射到固定大小值的函数。这个映射过程是不可逆的,即无法从哈希值反推回原始数据。
不同的数据通常会产生不同的哈希值,但是相同的数据总是会产生相同的哈希值。
由于哈希函数的特性,即使原始数据发生微小的变化,其哈希值也会发生较大的变化。
哈希值在计算机科学中有广泛的应用。其中一项主要应用是用于数据存储和检索的数据结构,例如哈希表(Hash Table)或哈希集合(Hash Set)。哈希值被用作数据的索引,可以快速定位和访问存储在哈希表中的数据。
在Java中,每个对象都有一个默认的哈希值,可以通过调用对象的hashCode()方法获取。默认情况下,hashCode()方法返回对象的内存地址的哈希码。Java允许我们重写hashCode()方法,根据对象的属性值计算哈希值,以便在需要时进行更精确的数据存储和检索。