集合框架比较两个对象是否相同(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:底层数据结构是哈希表, * 保证 ...
随机推荐
- codevs 1143 纪念品分组
1143 纪念品分组 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description ...
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例
前言: 我们在开发中,常常遇到单表的子-父id级联的表结构,在树形的深度不确定的情况下,一次查询出某个树形结构下的所有具有子-父级关系的数据变得十分困难. 这时,我们使用oracle提供的CONNEC ...
- jquery data 选择器 表格序列化serialize()
data()在元素上存放或者读取数据,返回jquery对象. demo: <div data-obj="{'name':'zhangsan','age':20}">&l ...
- Bishops
题意: 给定一个 $n*n$ 的国际棋盘,求问在上面放 $K$ 个象的方案数. 解法: 首先可以发现黑格和白格互不干扰,这样我们可以将黑格,白格分别求出. 考虑 $f(i,j)$ 表示坐标化后考虑长度 ...
- Hadoop 源代码组织结构
Hadoop 2.X 包括 编译好的可以直接部署的文件hadoop-{VERSION}.tar.gz; 还有源代码文件hadoop-{VERSION}-src.tar.gz , 需要 Maven 编译 ...
- 《剑指offer面试题4》替换空格——实现函数把字符串中每个空格替换成“%20”
思路: 例如把we are happy这个字符串中所有空格替换成"%20",最直接的做法是从头开始扫苗,遇到空格就替换,并且把空格后面的字符都顺序后移.复杂度O(n^2). 重要思 ...
- ZOJ3164【背包问题(好题)】
%%%%%%%%%%%%%%%岐爷 这一发从来没写过这么旺盛的背包问题... 想法很多,但是好难执行. 题意: 有N种饼干,1-N 每种最多想买Ki个,ki等于0的话没有上界 对于第i种饼干的权值是E ...
- 51nod 1051【基础】
思路: 找题4级做做...然后找了题最水的.. = =感动...居然是一下子[记]得了做法... dp一下,枚举列的起点和终点,然后求和这一段,然后对这一大列就是求个最大字段和: #include & ...
- tp5 验证器使用
路径 app\admin\validate\User.php 如果没有则创建该文件夹和文件 User.php <?php namespace app\junyi\validate; use th ...
- cogs 610. 数对的个数
610. 数对的个数 ★★ 输入文件:dec.in 输出文件:dec.out 简单对比时间限制:1 s 内存限制:128 MB Description出题是一件痛苦的事情!题目看多了也 ...