本帖最后由 yedong07a 于 2013-5-11 11:46 编辑
ArrayList有位置顺序,就像排队,HashSet先判断有没有相同的对象,不存相同数据。
public class ReflectTest2 {
public static void main(String[] args) throws Exception {
//Collection collections = new ArrayList();
Collection collections = new HashSet();
ReflectPoint pt1 = new ReflectPoint(3, 3);
ReflectPoint pt2 = new ReflectPoint(5, 5);
ReflectPoint pt3 = new ReflectPoint(3, 3);
collections.add(pt1);
collections.add(pt2);
collections.add(pt3);
collections.add(pt1);
// pt1.y = 7;
// collections.remove(pt1);
System.out.println(collections.size());
}
}
输出结果分别是:4和3
另有结果分别是:4和2
一个是视频一开始的结果一个是之后执行的结果,主要是pt1和pt3的比较,默认比较的是hashcode的值,通常是通过内存地址比较的
pt1.y = 7;这个注释掉的地方是内存泄露的一个现象,在删除元素后再打印出的集合中的元素个数,当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了。
public class ReflectPoint {
private int x;
public int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + x;
result = prime * result + y;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
ReflectPoint other = (ReflectPoint) obj;
if (x != other.x)
return false;
if (y != other.y)
return false;
return true;
}
}
如果obj1.equals(obj2)的结果为true,那么obj1.hashCode()==obj2.hashCode()的结果也要为true
只要是两个不同的实例对象,即使它们的equals方法比较结果相等,它们默认的hashCode方法的返回值是不同的。
equals方法比较结果不相等的对象可以有相同的哈希码,或者说哈希码相同的两个对象的equals方法比较的结果可以不等
|