热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

(67)HashSet:元素唯一性hashCode、equals,元素唯一性执行过程解释

—–Set:元素无序(存入和取出的顺序不一定是一致),元素不可以重复—HashSet:底层数据结构是哈希表hashSet是如何保证元素唯一性

—–Set:元素无序(存入和取出的顺序不一定是一致),元素不可以重复
—HashSet:底层数据结构是哈希表
hashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成
如果元素的hashCode值相同,才会判断equals是否为true;如果元素的hashCode值不同,不会调用equals方法。
注意:对于判断元素是否存在(contains),删除(remove)、添加(add),都要先hashCode,后equals

Set集合的功能和Collection是一致的。

package com.HashSet;
import java.util.*;
/*
* 哈希集合,是先看哈希地址,因为是new出来的东西,所以他们的哈希地址均不同
* 被认为是不同的元素,不符合实际应用
*/

public class People {
private String name;
private int age;

People(String name,int age){
this.name=name;
this.age=age;

}

public String getName() {
return name;
}

public int getAge() {
return age;
}
public boolean equals(Object obj) //注意这里是复写,所以必须传Object对象
{
if(!(obj instanceof People))//集合中各种类型的元素,若不是人类型,则返回false
return false;

People p=(People)obj;
System.out.println(this.name+"---equals--"+p.name);
if(this.name==p.name&this.age==p.age)
return true;


return false;

}
public int hashCode() {
System.out.println(this.name+"---------hashCode");
//return 60;这是word上的讲解return

//用同一个hashCode使得没存入一个元素,就得判断equals,比较麻烦,所以可以在hashCode这做些判断,
//hashCode不相同的就不用再判断equals了,优化代码。
System.out.println("name.hashCode:"+(name.hashCode()+age)+"---------------------------------");
return name.hashCode()+age;
}


}


public class HashSetDemo {
public static void sop(Object obj) {
System.out.println(obj);

}
public void WuXu_BuChongFu() {
HashSet hs=new HashSet();
hs.add("java01");
hs.add("java01");
hs.add("java03");
hs.add("java05");

//public boolean add(E e)注意其返回值为布尔类型,在Set中,不允许有重复元素
//所以存入失败

Iterator it =hs.iterator();
while(it.hasNext())//set无序,所以打印结果很可能与存入的顺序不同
{
System.out.println(it.next());
}
}
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add(new People("a1",11));
hs.add(new People("a2",12));
hs.add(new People("a3",13));
hs.add(new People("a2",12));
sop("元素存入成功:!!!!!!!!");
//sop("a1:"+hs.contains(new People("a2",12)));//判断是否包含也是先判断hashCode,若不同,则一定不包含,若相同,则判断equals方法
//根据equals方法来得出返回值
sop("移除a3"+hs.remove(new People("a3",13)));//和contains相同判断过程


/*Iterator it=hs.iterator();
while(it.hasNext()) {
People p=(People)it.next();
sop(p.getName()+" "+p.getAge());
}*/

}
}

哈希地址解释:
这里写图片描述
总体而言,就是先看哈希码值,再看equals方法
因为People中对HashCode进行重写,所有对象均是同一个哈希地址。
(若不重写,就是自动生成哈希值,那么第一步就不相同,不用判断第二步。)
①a1正常填入。
②a2在填入前,先判断了hashCode,相同,所以用equals方法进行判断,姓名和年龄数值不同,所以存入.
③a3在填入前,先判断了hashCode,相同,所以用equals方法进行和已经存入的元素比较,比较的顺序不确定,如图所示,可以先a2再a1.均不同存入。
④a2在存入前,先判断了hashCode相同,所以用equals方法进行和已经存入的元素进行判断,比较顺序不确定,如图所示,先a3,再a2,比较到a2时,就判断出有相同的元素了,所以不存入a2,就不用再和a1比较了。
若在hashCode中输出一句话,就更容易理解了。见下面输出

a1———hashCode
a2———hashCode
a2—equals–a1
a3———hashCode
a3—equals–a1
a3—equals–a2
a2———hashCode
a2—equals–a1
a2—equals–a2


推荐阅读
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 开发笔记:9.八大排序
    开发笔记:9.八大排序 ... [详细]
  • 案例packagecn.itcast_02;importjava.util.HashSet;**需求:存储自定义对象,并保证元素的唯一性* ... [详细]
  • Whenoverridingtheequals()functionofjava.lang.Object,thejavadocssuggestthat,当重写java.lang. ... [详细]
  • 本文提供了使用Java实现Bellman-Ford算法解决POJ 3259问题的代码示例,详细解释了如何通过该算法检测负权环来判断时间旅行的可能性。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • 本文探讨了在Java中实现系统托盘最小化的两种方法:使用SWT库和JDK6自带的功能。通过这两种方式,开发者可以创建跨平台的应用程序,使窗口能够最小化到系统托盘,并提供丰富的交互功能。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 一、equals方法的作用1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Objec ... [详细]
  • 还要谈谈Equals和GetHashcode
    这篇随笔和上篇随笔《从两个数组中查找相同的数字谈Hashtable》都是为了下面分析Dictionary的实现做的铺垫一.两个逻辑上相等的实例对象。两个对象相等,除了指两个不同变量引用了 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 数组元素逆序排列的实现
    本文介绍了一种简单有效的方法,用于将整数数组中的元素进行逆序排列。通过折半交换对应位置的元素,可以高效地完成这一任务。 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
author-avatar
荆梦梦丶乐园
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有