黑马程序员技术交流社区
标题:
毕老师第14天集合框架HashSet的问题?
[打印本页]
作者:
黑马杨晨
时间:
2012-9-19 21:04
标题:
毕老师第14天集合框架HashSet的问题?
本帖最后由 黑马杨晨 于 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;
}
}
作者:
广驰
时间:
2012-9-19 21:18
每个都有继承自object的equlas方法,而String的equlas方法就是判断就是字符串内容是否相同,所以有时候==的效果和equlas一样,这个主要是取决于每个equlas中的代码,所以单纯的问equlas和==是不好比较的,只能说哪个类的equlas和==是同样效果
作者:
张 涛
时间:
2012-9-19 21:19
涉及到hash算法的集合,如hashSet,或者hashMap等,比较元素时,是先比较hashcode的,也就是调用元素自身的hashCode()方法,该方法是根据对象在内存中的实际位置算出来的,也就是一个对象对应一个hashcode值。但这个方法可以重写。
如果这两个元素的hashcode相同,()再调用元素自身的equals方法,去比较;equals方法默认和“==”一样,也是对象在内存中的位置必须一样。但这个方法也可以重写。
实际上,在不涉及hash算法的类中,equals方法好多都重写过,像string等。我们自己定义的类,一般也要重写equals方法。
而在涉及到hash算法的类中,重写equals方法是必须要重写hashcode方法的,否则,hashcode不同,equals是永远不会被调用的。
作者:
赵永康
时间:
2012-9-19 21:23
集合调用的就是hashCode()和equals()方法,你这个例子里面hasnCode()返回值为60 ,意思就是他们的哈希值一样,直接比较equals方法,在这个比较中。name是String类型的,String相当于一个常量,存在于字符串池中,“==”比较的是对象的地址值是否相同,equals比较式对象的内容是否相同。对于特殊的字符串 你此时调用==和equals结果肯定就是一样的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2