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>
相关文章推荐
- sort color
- JavaScript中getBoundingClientRect()方法详解
- iOS开发- initWithFrame 和 initWithCoder 什么情况下会初始化?
- 今天在网上看到一个百度的C++面试题目
- 【Leetcode】Reorder List
- UIViewController与TextField的位置调整
- java 编译-执行 命令
- MyClass(const MyClass&x){cout<<2;}
- MFC:ON_UPDATE_COMMAND_UI和ON_COMMAND消息的区别
- 视图的移动
- LA 3644 X-Plosives && LA 3027 Corporative Network (并查集入门)
- JNI_最简单的Java调用C/C++代码(自己整理)
- linux_c 开发(5-5)进程间通讯_消息队列
- Java文件字节流和字符流FileInputStream,FileOutputStream,FileReader,FileWriter
- ASCII表
- 把 >/dev/null 2>&1 干掉!
- 输入与输出函数(printf、putchar、puts和scanf、getchar)
- 逆置字符串
- HDU 1532 Drainage Ditches(最大流)
- UIKit 选项卡栏控制器 UITabBarController (未完成)