您的位置:首页 > 其它

HashSet如何判断加入的元素是否相同?

2015-08-03 20:22 471 查看
如果有的同学对equals()和hashCode()的用法和作用不熟悉(是熟悉),请先看一下这个


hashCode() 和equals() 区别和作用


------------------------------------------------------


package com.lee.collectionPac;

import java.util.HashSet;

class A {
public boolean equals(Object obj) {
return true;
}
}

class B {
public int hashCode() {
return 1;
}
}

class C {
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 2;
}

@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
return true;
}

}

public class HashSetTest {

public static void main(String[] args) {
HashSet hs = new HashSet();
// HashSet判断两个元素相等的标准是两个对象通过equals()方法比较相等和通过hashCode()方法的返回值相等
hs.add(new A());
hs.add(new A());
hs.add(new B());
hs.add(new B());
hs.add(new C());
System.out.println(hs);
System.out.println("hs的大小是:" + hs.size());

}

}



-------------------------------------------------------


下面的程序,如果你能看的明白,说明你明白了这个问题.


package com.lee.collectionPac;

import java.util.HashSet;
import java.util.Iterator;

class R {
int count;

public R(int count) {
this.count = count;
}

@Override
public int hashCode() {
// TODO Auto-generated method stub
return count;
}

@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (this == obj)
return true;
if (obj != null && obj.getClass() == this.getClass()) {
R r = (R) obj;
return r.count == this.count;
}
return false;
}

@Override
public String toString() {
// TODO Auto-generated method stub
return "count:" + count + "\n";
}

}

public class HashSetTest2 {

public static void main(String[] args) {
// TODO Auto-generated method stub
HashSet<R> hs = new HashSet<>();
hs.add(new R(5));
hs.add(new R(-3));
hs.add(new R(9));
hs.add(new R(-2));
System.out.println(hs);
//
Iterator<R> it = hs.iterator();
R first = it.next();
first.count = 5;
// 有重复元素,equals相等,hashCode返回值不相等
System.out.println(hs);

//
hs.remove(new R(5));
System.out.println(hs);

System.out.println("是否存在count为-2的元素:"+hs.contains(new R(-2)));
//修改的哪一个看似count为5的元素,实际上地址和new R(5)并不一样,于是他们的hashcode不一样
System.out.println("是否存在count为5的元素:"+hs.contains(new R(5)));
}
}
-----------------------------------------------------------
<span style="color:#ff0000;">特别叮嘱一下:没事别瞎改和equals(),hashCode()有关系的变量值,一旦你改了,很有可能导致HashSet的实例没法操作元素.</span>


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: