一个有意思的 Java HashSet 问题
昨天,在百度的 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 有一定的帮助。
一个有意思的 Java HashSet 问题的更多相关文章
- Java HashSet和TreeSet【笔记】
Java HashSet和TreeSet[笔记] PS:HashSet.TreeSet 两个类是在 Map 的基础上组装起来的类 HashSet 类注释 1.底层实现基于 HashMap,所以迭代时不 ...
- Java HashSet和HashMap源码剖析
转自: Java HashSet和HashMap源码剖析 总体介绍 之所以把HashSet和HashMap放在一起讲解,是因为二者在Java里有着相同的实现,前者仅仅是对后者做了一层包装,也就是说Ha ...
- Java——HashSet和TreeSet的区别
HashSetHashSet有以下特点 不能保证元素的排列顺序,顺序有可能发生变化 不是同步的 集合元素可以是null,但只能放入一个null当向HashSet集合中存入一个元素时,HashSe ...
- Java HashSet对txt文本内容去重(统计小说用过的字或字数)
Java HashSet对txt文本内容去重(统计小说用过的字或字数) 基本思路: 1.字节流读需要去重的txt文本.(展示demo为当前workspace下名为utf-8.txt的文本) 2.对读取 ...
- Linux环境下部署完JDK后运行一个简单的Java程序
前言 前一篇文章详细讲解了如何在Windows环境下安装虚拟机+Linux系统,并且成功部署了JDK. 不过部署完JDK之后,我们判断部署是否成功的依据是看"java -version&qu ...
- 一个简单的Java web服务器实现
前言 一个简单的Java web服务器实现,比较简单,基于java.net.Socket和java.net.ServerSocket实现: 程序执行步骤 创建一个ServerSocket对象: 调用S ...
- linux下一个有意思的问题(文件名以短划线或空格开头)
linux下一个有意思的问题(文件名以短划线开头) 这本是无意中的一个发现. 在linux下,文件名中含有 - 是没有问题,但是如果文件名是以-作为第一个字符的,那么就比较麻烦了. 问题演示 看这里, ...
- 【Jetlang】一个高性能的Java线程库
actor Jetlang 提供了一个高性能的Java线程库,该库是 JDK 1.5 中的 java.util.concurrent 包的补充,可用于基于并发消息机制的应用. .net的MS CCR ...
- Java HashSet和LinkedHashSet的用法
Java HashSet和LinkedHashSet的用法 类HashSet和LinkedHashSet都是接口Set的实现,两者都不能保存重复的数据.主要区别是HashSet不保证集合中元素的顺序, ...
随机推荐
- 前端纯css 图片的模糊处理
最近做的一个项目需要用到背景图的模糊处理,在网上查资料,发现用css的 filter 属性就可以解决,但是因为模糊度比较高,四周会有很长的模糊边,百度上也没找到解决的方法,,可喜的是最后我在分析一个d ...
- Mac 下安装Ruby环境(转)
步骤1 - 安装 RVM RVM 是干什么的这里就不解释了,后面你将会慢慢搞明白. $ curl -L https://get.rvm.io | bash -s stable 期间可能会问你sudo管 ...
- 动态创建 Log4net 实例
动态创建log4net 实例 根据业务类型,动态的创建日志实例,将日志写到不同目录.常见的配置文件中统一配置,不能满足需求. 引用log4net nuget安装命令: Install-Package ...
- Bootstrap手动打开隐藏模态框
开发的时候遇到一个bug,关闭模态框后背景灰色图层依旧还在.原来是用错了隐藏模态框的代码. 正确的调用方式如下: $("#id").modal("show"); ...
- Laravel 5 教程 - 文件上传
一.简介 Laravel 有很棒的文件系统抽象层,是基于 Frank de Jonge 的 Flysystem 扩展包. Laravel 集成的 Flysystem 提供了简单的接口,可以操作本地端空 ...
- python3操作mysql教程
一.下载\安装\配置 1. python3 Python3下载网址:http://www.python.org/getit/ 当前最新版本是python3.2,下载地址是 http://www.pyt ...
- Tokyo Tyrant(TTServer)系列(六)-数据丢失谁的错
,false,1,100);$mem->addServer ("127.9.9.1",1978,false,1,100);$start=microtime(true);for ...
- unity的自带特性
2016/9/24补充: unity官方有一篇文章对菜单扩展讲的不错 https://unity3d.com/cn/learn/tutorials/topics/interface-essential ...
- TextView中超链接拦截
TextView中的超链接点击时,其实是通过Intent方式的,因此会调用Activity中的startActivity(Intent intent)方法,所以可在此方法中做些简单的拦截操作 例如拦截 ...
- flink checkpoint 源码分析 (二)
转发请注明原创地址http://www.cnblogs.com/dongxiao-yang/p/8260370.html flink checkpoint 源码分析 (一)一文主要讲述了在JobMan ...