java中HashSet详解
来源:互联网 发布:剑灵男灵剑士捏脸数据 编辑:程序博客网 时间:2024/05/16 19:27
对于 HashSet 而言,它是基于 HashMap 实现的,HashSet 底层采用 HashMap 来保存所有元素,因此 HashSet 的实现比较
由上面源程序可以看出,HashSet 的实现其实非常简单,它只是封装了一个 HashMap 对象来存储所有的集合元素,所有放入
HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的
Object 对象。
HashSet 的绝大部分方法都是通过调用 HashMap 的方法来实现的,因此 HashSet 和 HashMap 两个集合在实现本质上是相同
的。
掌握上面理论知识之后,接下来看一个示例程序,测试一下自己是否真正掌握了 HashMap 和 HashSet 集合的功能。
Java代码
上面程序中向 HashSet 里添加了一个 new Name("abc", "123") 对象之后,立即通过程序判断该 HashSet 是否包含一个
new Name("abc", "123") 对象。粗看上去,很容易以为该程序会输出 true。
实际运行上面程序将看到程序输出 false,这是因为 HashSet 判断两个对象相等的标准除了要求通过 equals() 方法比较返
回 true 之外,还要求两个对象的 hashCode() 返回值相等。而上面程序没有重写 Name 类的 hashCode() 方法,两个 Name
对象的 hashCode() 返回值并不相同,因此 HashSet 会把它们当成 2 个对象处理,因此程序返回 false。
由此可见,当我们试图把某个类的对象当成 HashMap 的 key,或试图将这个类的对象放入 HashSet 中保存时,重写该类的
equals(Object obj) 方法和 hashCode() 方法很重要,而且这两个方法的返回值必须保持一致:当该类的两个的 hashCode
() 返回值相同时,它们通过 equals() 方法比较也应该返回 true。通常来说,所有参与计算 hashCode() 返回值的关键属
性,都应该用于作为 equals() 比较的标准。
如下程序就正确重写了 Name 类的 hashCode() 和 equals() 方法,程序如下:
Java代码
上面程序中提供了一个 Name 类,该 Name 类重写了 equals() 和 toString() 两个方法,这两个方法都是根据 Name 类的
first 实例变量来判断的,当两个 Name 对象的 first 实例变量相等时,这两个 Name 对象的 hashCode() 返回值也相同,
通过 equals() 比较也会返回 true。
程序主方法先将第一个 Name 对象添加到 HashSet 中,该 Name 对象的 first 实例变量值为"abc",接着程序再次试图将一
个 first 为"abc"的 Name 对象添加到 HashSet 中,很明显,此时没法将新的 Name 对象添加到该 HashSet 中,因为此处
试图添加的 Name 对象的 first 也是" abc",HashSet 会判断此处新增的 Name 对象与原有的 Name 对象相同,因此无法添
加进入,程序在①号代码处输出 set 集合时将看到该集合里只包含一个 Name 对象,就是第一个、last 为"123"的 Name 对
象。
阅读全文
0 0
- java中HashSet详解
- java中HashSet详解
- java中HashSet详解
- Java中hashSet详解
- java中HashSet详解
- Java中HashSet详解
- java中HashSet详解
- Java中HashSet详解
- java中HashSet详解
- Java中HashSet详解
- java中HashSet详解
- java中HashSet详解
- java中HashSet详解
- java中HashSet详解
- java中HashSet详解
- 【转载】java中HashSet详解
- java中HashSet详解(转)
- java中hashset()和equals()详解
- idea消息框等界面中文乱码显示成小方块
- 【Hibernate】(三)持久化对象的生命周期
- oracle小数格式化后,小数点前面没有0等问题
- Domain=WebKitErrorDomain Code=102
- GitHub上最火的Android开源项目,所有开源项目都有详细资料和配套视频
- java中HashSet详解
- 机器学习(三)决策树算法Decision Tree
- mysql 配置问题
- 智融集团:以人工智能风控技术,淬炼金融圈“最强大脑”
- hdu 6121 Build a tree
- android 向系统插入一条通话记录
- 文章标题 HDU 1533 : Going Home (最小费用最大流)
- vim 主题失效
- HDU6127-Hard challenge