昨天,在百度的 java吧 看到有人问关于 HashSet 的问题。下面是他贴出的代码:

 import java.util.HashSet;

 public class JavaTest
{
public static void main(String[] args)
{
HashSet<Person> hs = new HashSet<Person>();
Person p = new Person("张三", 21);
hs.add(p);
p.setName("李四");
p.setAge(22);
hs.add(p);
System.out.println(hs);
}
} class Person
{
private String name;
private int age; Person(String name, int age)
{
this.name = name;
this.age = age;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public int getAge()
{
return age;
} public void setAge(int age)
{
this.age = age;
} public int hashCode()
{
return name.hashCode() + age * 21;
} public boolean equals(Object obj)
{
if (obj instanceof Person)
{
Person p = (Person) obj;
return name.equals(p.getName()) && age == p.getAge();
}
else
{
return false;
}
} public String toString()
{
return name + "--" + age;
}
}

输出结果:

[李四--22, 李四--22]

楼主不明白为什么 HashSet 中的两个元素是一样的。不是说好了 Set 中不能有重复的元素吗?

我自信对 HashSet 还比较熟悉(尽管没研究过源代码),赶紧写了个回复,结果还没说到点子上。

后来楼主又改了一下 equals 方法和测试函数:

import java.util.HashSet;

public class JavaTest
{
public static void main(String[] args)
{
HashSet<Person> hs = new HashSet<Person>();
Person p = new Person("张三", 21);
hs.add(p);
p.setName("李四");
p.setAge(22);
hs.add(p);
hs.add(new Person("李四", 22));
hs.add(new Person("张三", 21)); System.out.println(hs);
}
} class Person
{
private String name;
private int age; Person(String name, int age)
{
this.name = name;
this.age = age;
} public String getName()
{
return name;
} public void setName(String name)
{
this.name = name;
} public int getAge()
{
return age;
} public void setAge(int age)
{
this.age = age;
} public int hashCode()
{
return name.hashCode() + age * 21;
} public boolean equals(Object obj)
{
//增加了判断是否为同一个对象
if (this == obj)
{
return true;
} if (obj instanceof Person)
{
Person p = (Person) obj;
return name.equals(p.getName()) && age == p.getAge();
}
else
{
return false;
}
} public String toString()
{
return name + "--" + age;
}
}

输出结果是:

[李四--22, 李四--22, 张三--21]

如果理解 HashSet 原理,上面的结果倒也不难解释。

大家看看吧,挺有意思的,我觉得对理解 HashSet 有一定的帮助。

最新文章

  1. jquery分页插件
  2. ACM对时间掌控力和日积月累的习惯的意义
  3. Sublime 不自动打开上次未关闭的文件 设置方法
  4. UUID的具体用法
  5. 物理卷操作命令:pvcreate,pvscan,pvdisplay.卷组操作命令:vgcreate,vgdisplay.
  6. 在OC和Swift中使用IBDesignable/IBInspectable
  7. Web API Test Client 1.2.0
  8. SQL2008无法连接到.,及sa登录失败的总结
  9. AngularJS操作DOM——angular.element
  10. lambda表达式初步
  11. AV-TEST杀毒软件能力测试(2018年1月-12月)杀毒软件排名
  12. JSTL配置文件下载地址
  13. html5 - Storage 本地存储
  14. iOS Core Data 数据库的加密(待研究)
  15. subprocess.Popen指令包含中文导致乱码问题解决
  16. 创建一个规范的django项目
  17. SSH 互信
  18. hdu 5129 (枚举) The E-pang Palace
  19. javascript控件(一):一个好用的日历
  20. php导出excel时间错误(同一个时间戳,用date得到不同的时间)

热门文章

  1. 几种适配器&amp;观察者&amp;ListView之间的那点事
  2. PHP扩展开发及内核应用(未完)
  3. 点滴积累【other】---win2003 service pack2 IIS 无法复制CONVLOG.EXE CONVLOG.EX_(转载)
  4. 点滴积累【C#】---C#实现上传word以流形式保存到数据库和读取数据库中的word文件。
  5. Atitit.用户权限服务 登录退出功能
  6. Effective JavaScript Item 37 认识this的隐式指向
  7. 2.请求库之requests
  8. 将json数组字符串转换为json数组对象(值是json对象的数组)
  9. FileZilla Server-Can’t access file错误解决方法
  10. deepin linux 下C开发环境配置