您的位置:首页 > 其它

HashSet详解

2016-04-22 14:21 411 查看
HashSet中不能存放相同的元素这点大家都知道,对于仅存放基本类型的Set集合不会有很大困难理解,但是当Set中存放的是对象引用时,就得去重写该对象的hashCode和equals方法了,并且Set集合就是依据这两个方法来判断存入引用的一致性。

import java.util.HashSet;

public class HashSetTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<Name> set = new HashSet<Name>();
set.add(new Name("abc", "123"));
set.add(new Name("abc", "456"));
// 由运行结果可以得知,由于重写的hashCode和equals方法是依据first来判断对象是否相等
//所以即使添加的两个变量last不同也不能添加进set中
System.out.println(set);
}

}

class Name {
private String first;
private String last;

public Name(String first, String last) {
this.first = first;
this.last = last;
}

// 重写Name类的equals方法,依据first实例变量判断
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null) {
return false;
}
if (o.getClass() != getClass()) {
return false;
}

Name other = (Name) o;
return first.equals(other.first);

}

// 重写Name类的hashCode方法,依据first实例变量判断
@Override
public int hashCode() {
// TODO Auto-generated method stub
return first.hashCode();
}

@Override
public String toString() {
return "Name [first=" + first + ", last=" + last + "]";
}

}

由此可知,当试图把某个类的对象当成HashCode的Key,或者试图将这个类的对象放入HashSet中保存时,重写这个类的equals(Object obj)方法和hashCode()方法很重要,并且这两个方法的返回值必须一致。当该类的两个hashCode()返回值相同时,他们通过equals方法比较也应该保持一致。通常来说,所有参与计算hashCode()返回值的关键属性,都应该用于作为equals()比较的标准。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息