A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yedong07a 中级黑马   /  2013-5-6 23:59  /  1759 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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方法比较的结果可以不等


评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
如果问题解决了,请将分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马