黑马程序员技术交流社区

标题: 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 编辑
  1. public boolean equals(Object obj) //这里是覆写了Object根类的equals方法,自已定义一个比较条件:姓名和年龄都相同才视为同一个人
  2. {
  3.   if(!(obj instanceof Person)) //如果传递进来的不是Person类类型的,就不是要比较的类
  4.   return false; //就没必要比较,因为肯定不相等,就返回了false,你这里也可以直接抛异常
  5.   Person p = (Person)obj; //如果传进来是Person类类型的,就要强转,因为equals的形式参数是Object类型的,当传递Person进来的时候会提升成Objcet类,而你比较的是Person这种类的name和age,所以要强转向下转行为Person
  6. System.out.println(this.name+"...equals.."+p.name);
  7.   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
  1. public boolean equals(Object obj)
  2. {
  3.   if(!(obj instanceof Person))
  4.    return false;
  5.   Person p = (Person)obj;//此处的等式没有看懂,
  6.   System.out.println(this.name+"...equals.."+p.name);
  7.   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