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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马杨晨 中级黑马   /  2012-9-19 21:04  /  1295 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马杨晨 于 2012-9-23 14:02 编辑

下面这段代码是毕老师14天 第13个视频的代码
老师讲的在HashSet下比较是先比较哈希值,如果哈希值相同再用equals比较,
下面我用equals和==比较效果一样,如果不自定义equals他们底层是比较的什么呢?

/*
往hashSet集合中存入自定义对象
姓名和年龄相同为同一个人,重复元素。
*/
import java.util.*;

class HashSetTest
{
public static void main(String[] args)
{
  HashSet hs = new HashSet();
  
  hs.add(new Person("al",11));
  hs.add(new Person("a2",12));
  hs.add(new Person("a3",13));
  hs.add(new Person("a2",12));
//  hs.add(new Person("a4",14));
  
  Iterator it = hs.iterator();
  
  while(it.hasNext())
  {
   Person p = (Person)it.next();
   sop(p.getName()+"::"+p.getAge());
   sop(p);
  }
}

public static void sop(Object obj)
{
  System.out.println(obj);
}
}

class Person
{
private String name;
private int age;
Person(String name,int age)
{
  this.name = name;
  this.age = age;
}

public int hashCode()
{
  return 60;
}

public boolean equals(Object obj)
{
  if(!(obj instanceof Person))
   return false;
  Person p = (Person)obj;
  System.out.println(this.name+"......"+p.name);
  
// return this.name.equals(p.name) && this.age==p.age;
  return this.name==p.name && this.age==p.age;

}

public String getName()
{
  return name;
}
public int getAge()
{
  return age;
}
}

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
每个都有继承自object的equlas方法,而String的equlas方法就是判断就是字符串内容是否相同,所以有时候==的效果和equlas一样,这个主要是取决于每个equlas中的代码,所以单纯的问equlas和==是不好比较的,只能说哪个类的equlas和==是同样效果
回复 使用道具 举报
涉及到hash算法的集合,如hashSet,或者hashMap等,比较元素时,是先比较hashcode的,也就是调用元素自身的hashCode()方法,该方法是根据对象在内存中的实际位置算出来的,也就是一个对象对应一个hashcode值。但这个方法可以重写。
如果这两个元素的hashcode相同,()再调用元素自身的equals方法,去比较;equals方法默认和“==”一样,也是对象在内存中的位置必须一样。但这个方法也可以重写。
实际上,在不涉及hash算法的类中,equals方法好多都重写过,像string等。我们自己定义的类,一般也要重写equals方法。
而在涉及到hash算法的类中,重写equals方法是必须要重写hashcode方法的,否则,hashcode不同,equals是永远不会被调用的。
回复 使用道具 举报
集合调用的就是hashCode()和equals()方法,你这个例子里面hasnCode()返回值为60 ,意思就是他们的哈希值一样,直接比较equals方法,在这个比较中。name是String类型的,String相当于一个常量,存在于字符串池中,“==”比较的是对象的地址值是否相同,equals比较式对象的内容是否相同。对于特殊的字符串 你此时调用==和equals结果肯定就是一样的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马