黑马程序员技术交流社区
标题:
hashset的一个例子,有点疑问
[打印本页]
作者:
记得上线
时间:
2012-7-14 13:56
标题:
hashset的一个例子,有点疑问
import java.util.*;
/*
往hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素。
*/
class HashSetTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}
public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person("a1",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));
//sop("a1:"+hs.contains(new Person("a2",12)));
// hs.remove(new Person("a4",13));
Iterator it = hs.iterator();
while(it.hasNext())
{
Person p = (Person)it.next();
sop(p.getName()+"::"+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name = name;
this.age = age;
}
public int hashCode()//
{
System.out.println(this.name+"....hashCode");
return name.hashCode()+age*37;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;//此处的等式没有看懂,
System.out.println(this.name+"...equals.."+p.name);
return this.name.equals(p.name) && this.age == p.age; }
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
作者:
黄丽慧
时间:
2012-7-14 14:01
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;//
该方法的参数是一个object型的,但实际上往hashset里面存的数据是person类型的,因此要先进行判断,如果不是person类型的对象就直接不用往里存,如果是person对象的话,要调用其姓名和年龄的属性就需要向下转型,把object类型参数强转为person类型的
System.out.println(this.name+"...equals.."+p.name);
return this.name.equals(p.name) && this.age == p.age; }
作者:
余清兰
时间:
2012-7-14 15:57
本帖最后由 余清兰 于 2012-7-14 15:59 编辑
public boolean equals(Object obj) //这里是覆写了Object根类的equals方法,自已定义一个比较条件:姓名和年龄都相同才视为同一个人
{
if(!(obj instanceof Person)) //如果传递进来的不是Person类类型的,就不是要比较的类
return false; //就没必要比较,因为肯定不相等,就返回了false,你这里也可以直接抛异常
Person p = (Person)obj; //如果传进来是Person类类型的,就要强转,因为equals的形式参数是Object类型的,当传递Person进来的时候会提升成Objcet类,而你比较的是Person这种类的name和age,所以要强转向下转行为Person
System.out.println(this.name+"...equals.."+p.name);
return this.name.equals(p.name) && this.age == p.age; } //这里的equals是字符串的equals方法,因为this.name是String类型的,String类覆写了Object类的equals方法后比较的是对象的内容是否相同,所以this.name.equals(p.name)判断的是当前对象的name和传入的p引用对象的name是否相同,age是基本数据类型直接用==判断,this.age == p.ag,是否内容相等,两个条件都满足视为同一个人,是重复元素
复制代码
作者:
黑马刘涛
时间:
2012-7-14 16:58
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;//此处的等式没有看懂,
System.out.println(this.name+"...equals.."+p.name);
return this.name.equals(p.name) && this.age == p.age; }
复制代码
Person p = (Person)obj;强制类型转换,你传的参数是Object类型,而集合里的元素是Person类型,当然程序运行时会提示使用未经检查或不安全的操作。
作者:
黑马高明辉
时间:
2012-7-14 17:11
回帖有分?
作者:
黑马高明辉
时间:
2012-7-14 17:11
回两次还有么?
作者:
鲍霄霄
时间:
2012-7-14 18:51
这很清晰的是一个强制类型转换,因为你重写的这个方法是用来比较Person对象是否相同的,而不是Object对象。但为什么要强制类型转换呢,很简单举个例子:你现在不是要用p.name嘛,那我们就把Person当成一只鸡,name当鸡蛋(因为name是它的一个属性),Object当家禽。你去超市买鸡蛋,你只能说要鸡蛋,而不能说要家禽的蛋,因为家禽的蛋有鸡蛋鸭蛋鹅蛋等等很多种。你现在要鸡的蛋,那么你就要明确指出是鸡的蛋,所以就你要把家禽强制说成鸡。因为Object对象的范围太广,首先你需要明确一点,HashSet中不能存相同的数据,如果你存String类型的,那就很好比较了,但是你要存引用数据类型的,那么你就要自己写出相应的比较方法,这样JAVA才会知道如何去比较你放进去的两个对象是不是相同的。还有,之所以这里是Object类型的参数,是因为所有的类默认都继承自Object,而那个方法是重写的方法,如果你要不是把它写成重写的方法,那么HashSet在往里面存对象的时候,就没法调用你自己写的那个比较的方法来对你存入的对象做比较。所以,第一,那个参数必须是Object类型,第二,你必须要强制类型转换成Person类型的对象。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2