集合框架比较两个对象是否相同(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:底层数据结构是哈希表, * 保证 ...
随机推荐
- 使用 WinSCP(下载) 上文件到 Linux图文教程
问题导读: 1.如何远程链接? 2.如何上传文件? 3.如何对立面的文件进行操作? 4.什么情况下会链接失败? https://yunpan.cn/cYWtNMycjeVPv 访问密码 4f7 ...
- Flask-SQLAlchemy配置
下面是 Flask-SQLAlchemy 中存在的配置值.Flask-SQLAlchemy 从您的 Flask 主配置中加载这些值. 注意其中的一些在引擎创建后不能修改,所以确保尽早配置且不在运行时修 ...
- 洛谷 P3803 多项式乘法(FFT) —— FFT
题目:https://www.luogu.org/problemnew/show/P3803 终于学了FFT了! 参考博客:https://www.cnblogs.com/zwfymqz/p/8244 ...
- 微信小程序 实现websocket长连接 以及断开连接之后自动重连
app.js let socketMsgQueue = [] let isLoading = false App({ globalData: { userInfo: null, localSocket ...
- [置顶]
谈EXPORT_SYMBOL使用
转自:http://blog.csdn.net/macrossdzh/article/details/4601648 EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static ...
- CSS元素:clip属性作用说明
clip属性是一个比较有用的属性,但往往在实际应用中,并不多见,介绍的也很少.应用clip属性需要注意的两点: 一.clip属性必须和定位属性postion一起使用才能生效. 二.clip裁切的计算坐 ...
- java泛型基础、子类泛型不能转换成父类泛型--未完待续
参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...
- mysql 事务 存储过程 函数
一:事务: 开启一个事务可以包含一些SQL语句,这些sql语句要么同时成功, 要么一个都别想成功, 称之我事务的原子性 事务用于将某些操作的多个SQL 作为原子性操作, 一旦有某一个出现错误, 即可以 ...
- 7.11实习培训日志-Git Linux
Git git子模块 先在GitHub创建两个空的respository,一个super_project和一个sub_project. 然后在git bash中向库中写入一些文件. 在super_pr ...
- Tomcat注入到系统服务中,实现服务自启动及常驻
步骤一.打开service.bat 并修改(推荐notepad++): 1.set SERVICE_NAME=Tomcat6(服务名称,可在命令行中通过该名字进行服务的控制(启动/关闭)) 2.se ...