黑马程序员技术交流社区

标题: ArrayList和HashSet的比较? [打印本页]

作者: yedong07a    时间: 2013-5-6 23:59
标题: ArrayList和HashSet的比较?
本帖最后由 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方法比较的结果可以不等



作者: 许庭洲    时间: 2013-5-7 07:27
值得学习ing!
作者: 黄玉昆    时间: 2013-5-8 21:15
如果问题解决了,请将分类改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2