集合框架比较两个对象是否相同(equals和hashCode方法)
package com.dcz.hashset; import java.util.HashSet;
import java.util.Set; /**
* HashSet是接口最常用的实现类,顾名思义,底层采用了哈希表算法。
*
* 在HashSet中如何判断两个对象是否是否相等问题分析:
* 1. 要用两个对象的equals方法比较,返回true说明对象相同。
* 2. 两个对象的hashCode方法返回值相同。
*
* 对象hashCode决定了在哈希表中的存储位置。
*
* 向HashSet集合中添加新对象时候,先会判断该对象和集合对象中的hashCode值:
* 1. 不等:直接把该对象存储到hashCode的指定位置。
* 2. 相等:再继续判断新对象和集合对象中的equals做比较。
* 2.1. equals方法true,则视为是同一个对象,则不保存在哈希表中。
* 2.2. equals方法false,存储在之前对象同槽位的链表上(拒绝)。
*
* 对象的HashCode和equals方法的重要性。
*
* 存储在哈希表中的对象,都应该覆盖equals方法和hashCode方法,并且保证equals相等的时候hashCode值也相等。
*
* *****************************************************************
* 结论:如果需要把我们自定义的对象存储到哈希表中,该类型的对象必须覆盖equals和hashCode方法,
* 并在该方法中提供自己的判断规则,可以使用eclipse工具自动生成hashCode和equals方法。
* *****************************************************************
*/ class A{ @Override
public boolean equals(Object obj) {
return true;
}
} class B{ @Override
public int hashCode() {
return 1;
}
} class C{ @Override
public int hashCode() {
return 2;
} @Override
public boolean equals(Object obj) {
return true;
}
} class Student{
private int sn;
private String name;
private int age;
public Student(int sn, String name, int age) {
super();
this.sn = sn;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [sn=" + sn + ", name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + sn;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (sn != other.sn)
return false;
return true;
} } public class Hash { public static void main(String[] args) {
// Set setInt = new HashSet();
// setInt.add(new A());
// setInt.add(new A());
// setInt.add(new B());
// setInt.add(new B());
// setInt.add(new C());
// setInt.add(new C());
// System.out.println(setInt); Set<Student> set = new HashSet<Student>(); set.add(new Student(1, "赵一", 17));
set.add(new Student(2, "赵一", 17));
set.add(new Student(1, "张三", 18));
set.add(new Student(1, "张三", 18)); System.out.println(set.size());
System.out.println(set); } }
集合框架比较两个对象是否相同(equals和hashCode方法)的更多相关文章
- Java基础(六)判断两个对象相等:equals、hashcode、toString方法
1.equal方法 Object类中的equal方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.然 ...
- 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射
从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...
- java集合(3)- Java中的equals和hashCode方法详解
参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
- Java Hash集合的equals()与hashCode() 方法
Java 集合实现类,无论是HashSet.HashMap等所有的Hash算法实现的集合类(后面简称Hash集合),加入的对象必须实现 hashCode() 与 equals() 方法,稍微不同的地方 ...
- List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)
1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...
- 集合框架(HashSet存储自定义对象保证元素唯一性)
HashSet如何保证元素唯一性的原理 1.HashSet原理 a. 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降 ...
- 集合框架-HashSet存储自定义对象
1 package cn.itcast.p4.hashset.test; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 6 ...
- List集合去除重复对象及equals()、hashCode()方法的作用
原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...
- java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证 ...
随机推荐
- regular
regular.py import re # . # 只能匹配一个字母,而不是2个或0个 # \ # 转义 # 'abc\\.com' r'abc\.com' # 字符集[] # 匹配他所包括的任意字 ...
- windows查看与清理dns缓存
1.windows下在命令行输入 ipconfig /flushdns 清理本地dns缓存查看dns缓存 ipconfig/displaydns2.Mac OSX下在命令行输入 lookupd ...
- Microsoft Speech SDK开发包 使用
下载开发包.我们首先从微软的官网上面下载开发包,下载地址如下: http://www.microsoft.com/en-us/download/details.aspx?id=10121我们主要下载三 ...
- Mertens
题意: 求解$\sum_{i=a}^b{\mu(i)}$. 解法: 由$(\mu * I)(n) = e(n)$ 得 $\sum_{d|n}{\mu(d)} = [n=1]$ 得 $\mu(n) = ...
- HDOJ-1280
前m大的数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- ubuntu删除g2o
解决方法为:(1)删除/usr/local/include/g2o,指令为sudo rm -rf /usr/local/include/g2o:(2)删除/usr/local/lib下有关libg2o ...
- TypeScript完全解读(26课时)_14.ES6和Nodejs中的模块
创建modules文件夹,我们的文件都写在这里面 modules下面新建index.js文件,在index.ts内引入这个js文件 es6的模块 最主要的两个关键字 import和export imp ...
- HTML学习笔记(四)常用标签
1.超链接 <a href="url">Link text</a> eg:<a href="http://www.w3school.com. ...
- .net 反射构造你自己的“匿名”对象
由于近来项目的底层架构某些特殊需求及场景的需要要求动态build一个对象, 属性名称个类与类型都是外界动态传入的. 不多说废话,直接上我最原始的代码: public static Type GetMy ...
- MVC 基本工具(Visual Studio 的单元测试、使用Moq)
3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的.本文打算使用 Visual Studio 附带的内建单元测试支持,但其他一些.NET单元测试包也是可用的. ...