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方法)的更多相关文章

  1. Java基础(六)判断两个对象相等:equals、hashcode、toString方法

    1.equal方法 Object类中的equal方法用于检测一个对象是否等于另外一个对象.在Object类中,这个方法将判断两个对象是否具有相同的引用.如果两个对象具有相同的引用,它们一定是相等的.然 ...

  2. 从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射

    从上面的集合框架图可以看到,Java 集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合,另一种是图(Map),存储键/值对映射.Collection 接口又有 3 ...

  3. java集合(3)- Java中的equals和hashCode方法详解

    参考:http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

  4. Java Hash集合的equals()与hashCode() 方法

    Java 集合实现类,无论是HashSet.HashMap等所有的Hash算法实现的集合类(后面简称Hash集合),加入的对象必须实现 hashCode() 与 equals() 方法,稍微不同的地方 ...

  5. List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)

    1. 常规元素去重 碰到List去重的问题,除了遍历去重,我们常常想到利用Set集合不允许重复元素的特点,通过List和Set互转,来去掉重复元素. // 遍历后判断赋给另一个list集合,保持原来顺 ...

  6. 集合框架(HashSet存储自定义对象保证元素唯一性)

    HashSet如何保证元素唯一性的原理 1.HashSet原理 a. 我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降 ...

  7. 集合框架-HashSet存储自定义对象

    1 package cn.itcast.p4.hashset.test; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 6 ...

  8. List集合去除重复对象及equals()、hashCode()方法的作用

    原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...

  9. java集合框架(hashSet自定义元素是否相同,重写hashCode和equals方法)

    /*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不一致,元素不可以重复 * (通过哈希值来判断是否是同一个对象) * ----HashSet:底层数据结构是哈希表, * 保证 ...

随机推荐

  1. 51nod1060:最复杂的数(DFS求反素数)

    把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数.   例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6.如果有多个数复杂度相等,输出最 ...

  2. java虚拟机内存溢出和泄漏实例

    测试参数设置: 1.循环调用new A()实现堆溢出,java.lang.OutOfMemoryError: Java heap space, 虚拟机参数:-Xms1M -Xmx1M -XX:+Hea ...

  3. python 二分法例子及冒泡排序

    #!/usr/bin/env python #-*- coding:utf-8 -*- def binary_search(source_data,find_nu): mid = len(source ...

  4. Jmeter 施压 SQL server数据库的时候,如何设置?

    1. 在应用Jmeter进行施压之前,有个重要的端口需要手动查找出来.该端口在第三部要使用.开始——程序——microsoft SQL Server 2008R2——配置工具——SQL Server ...

  5. SQL Server 盛宴系列 webcast

    数据库学习站点,示例,视频 http://technet.microsoft.com/zh-cn/dd722671.aspx

  6. Mike and distribution

    题意: 给定 $n$ 个物品,每个物品有两个属性$a_i$, $b_i$,求一个长度为$[\frac{n}{2}]+1$的子序列 $p$ 使得 $2 * \sum_{i = 1}^{|p|}{a_{p ...

  7. apk重签名的两种方法

    因为robotium要求被测应用和测试代码要有一致的签名, 所以需要将apk包重签名. 方法一:通过re-sign.jar来产生debug key的apk(不适用于jdk 7以上) re-sign.j ...

  8. c语言中的# ## 可变参数宏 ...和_ _VA_ARGS_ _

    1.#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串.例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字 ...

  9. Ubuntu18.04安装和配置Java JDK11并卸载自带OpenJDK

    卸载自带的OpenJDK方法: 在终端执行命令:sudo apt-get remove openjdk* Ubuntu18.04安装JDK11.0.2 前面步骤一样,可参考:https://www.c ...

  10. POJ 1182 食物链 (破题)

    题意:中文题. 析:对POJ 真是无语,有的题用G++过不了,C++能过,有的题不写EOF(题目明明说就一组的数据的)不过,有的题写EOF也不过, 这个题就是写EOF就过不了... 这个题用的是加权并 ...