初步认知HashSet

来源:互联网 发布:数据存储系统厂家 编辑:程序博客网 时间:2024/05/22 22:34
HashSet是通过HashMap<E,Object>来实现的;hashcode是通过哈希表实现的,HashSet中的数据时无序的,可以放入null,但只能放入一个null,两者中的值都不能重复。
HashSet要求放入的对象必须实现hashcode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例,即使一个对象和另一个的对象值是一样,也是可以存进去的,因为这些是按照对象的hashcode是不一样的
HashSet不保证集合的迭代书序,特别是HashSet不保证该顺序恒久不变,如果迭代性能很重要,则不要将初始容量设置的太高(或者将加载因子设置的太低)一般都是0.75。
HashSet底层数据结构是哈希表,通过hashCode方法和equals方法来保证元素的唯一性。比较原理,判断类中的属性各个hashcode 计算的值,如hashcode值相同才会去判断equals,否则,是不会调用equals方法的。
根据以上原理得知,我们必须要重写hashcode()和equals()方法,得以实现同一个类放入的内容不会重复。


import java.util.HashSet;
import java.util.Set;


public class Test {


public static void main(String[] args) {
//new一个hashset
Set<Preson> s= new HashSet<Preson>();
//new一个preson赋值
Preson p=new Preson("xiaohua",18); 
Preson p1=new Preson("ruhua",18);
Preson p2=new Preson("ruhua",18);
Preson p3=new Preson("mahua",19);

// 1.调用equals方法  进行比较,true 丢弃,false 添加
s.add(p);
s.add(p1);
s.add(p2);
s.add(p3);
//遍历preson
for(Preson pp : s) {
System.out.println(pp);
}
}
}


class Preson{
private String name;
private Integer age;

public Preson(String name , Integer age) {
this.name = name;
this.age = age;
}
public String toString(){

return "name = "+ name +";age = "+age;
}

// 获取哈希值
public int hashCode() {


//名字和年龄相同 返回其值
return name.hashCode() + age.hashCode();
}

//Object anObject 表示新加入的对象    
public boolean equals(Object anObject) {
   //把对象强制转换为Preson
Preson  p= (Preson)anObject;
   //this 表示要和他比较的对象 比较两个对象 是不是同一个对象
if(this == p){
return true;//true 表示同一个对象
}


   //判断是不是同一个类型
if(!(anObject instanceof Preson)){
return false;//false 表示不同类型
}


//判断两个的年龄是否相等
if(this.age == p.age){
return true;//true 表示相等
}
return false;


}
}