一个有意思的 Java HashSet 问题
2024-09-26 03:25:46
昨天,在百度的 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 有一定的帮助。
最新文章
- jquery分页插件
- ACM对时间掌控力和日积月累的习惯的意义
- Sublime 不自动打开上次未关闭的文件 设置方法
- UUID的具体用法
- 物理卷操作命令:pvcreate,pvscan,pvdisplay.卷组操作命令:vgcreate,vgdisplay.
- 在OC和Swift中使用IBDesignable/IBInspectable
- Web API Test Client 1.2.0
- SQL2008无法连接到.,及sa登录失败的总结
- AngularJS操作DOM——angular.element
- lambda表达式初步
- AV-TEST杀毒软件能力测试(2018年1月-12月)杀毒软件排名
- JSTL配置文件下载地址
- html5 - Storage 本地存储
- iOS Core Data 数据库的加密(待研究)
- subprocess.Popen指令包含中文导致乱码问题解决
- 创建一个规范的django项目
- SSH 互信
- hdu 5129 (枚举) The E-pang Palace
- javascript控件(一):一个好用的日历
- php导出excel时间错误(同一个时间戳,用date得到不同的时间)
热门文章
- 几种适配器&;观察者&;ListView之间的那点事
- PHP扩展开发及内核应用(未完)
- 点滴积累【other】---win2003 service pack2 IIS 无法复制CONVLOG.EXE CONVLOG.EX_(转载)
- 点滴积累【C#】---C#实现上传word以流形式保存到数据库和读取数据库中的word文件。
- Atitit.用户权限服务 登录退出功能
- Effective JavaScript Item 37 认识this的隐式指向
- 2.请求库之requests
- 将json数组字符串转换为json数组对象(值是json对象的数组)
- FileZilla Server-Can’t access file错误解决方法
- deepin linux 下C开发环境配置