详述HashSet类add方法(二)

基于ProXmoX VE的虚拟化家庭服务器(篇一)—ProXmoX VE 安装及基础配置 ProxmoxVE是一款套开源的虚拟化管理软件,用户可通过网页的方式来管理服务器上使用kvm以及lxc技术运行的虚拟机。同时提供了一些先进功能的支持,如集群、HA等。PVE虽然是开源,却是由一个商业公司在运营、更新以及维护。... 阅读详情

此时我们来分析当添加重复元素进HashSet集合时的情况
源码如下:
add方法:

	public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

put方法:

	public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);//存第一个和第二个值的时候由于hashCode相同,所以第二次存的对象与第一次存的对象hash(key)结果是一样的
    }

hash()方法:

	static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

putVal()方法:

	final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)//由于存第一个对象时table全局变量已经有值了,所以table tab不为空   tab.length不等于0,所以该if为false   n为 16
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)// i = (n - 1) & hash 数组长度-1  & hash值,即16-1 & hash,因为第一个和第二个值的时候由于hashCode相同,所以存第一个值和存第二个值的时候(n - 1) & hash的值是一样的,因为第一次已经在此(n - 1) & hash 位置存了数据tab[i = (n - 1) & hash]不为null p不为null  (p = tab[i = (n - 1) & hash]) == null  false  结论:向HaspMap存储数据时,如果当前数据的hashcode和集合中已存在的元素的hashcode相同,则该if不成立
            tab[i] = newNode(hash, key, value, null);
        else {
            Node<K,V> e; K k;
            if (p.hash == hash//集合中Node元素包含的值的hash,即第一个Jim的hash值
               & ((k = p.key) == key || (key != null && key.equals(k))))// (k = p.key) == key,由于两次的对象是一个地址 true,names.add(new String("Jim")); 则false;(key != null && key.equals(k)) 为true
                e = p;//将第一个Jim的地址为e
            else if (p instanceof TreeNode)
                e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
            else {
                for (int binCount = 0; ; ++binCount) {
                    if ((e = p.next) == null) {
                        p.next = newNode(hash, key, value, null);
                        if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
                            treeifyBin(tab, hash);
                        break;
                    }
                    if (e.hash == hash &&
                        ((k = e.key) == key || (key != null && key.equals(k))))
                        break;
                    p = e;
                }
            }
            if (e != null) { // existing mapping for key
                V oldValue = e.value;// e.value  常量Object
                if (!onlyIfAbsent || oldValue == null)// onlyIfAbsent本来就为false,所以!onlyIfAbsent true
                    e.value = value;
                afterNodeAccess(e);
                return oldValue;//返回第一个Jim,存储失败
            }
        }
        ++modCount;
        if (++size > threshold)
            resize();
        afterNodeInsertion(evict);
        return null;
    }

当我们像集合中添加元素时候,首先会判断集合中是否存在重复元素,如果存在重复元素,那么会返回第一个Jim到add方法,此时显然不为空,那么

		return map.put(e, PRESENT)==null;

此时显然为false,存储失败
需要我们注意的是,hash()方法主要用来判断元素内容是否相等
演示如下:

		String str1 = "111";
        String str2 = new String("111");
        System.out.println(hash(str1));//48657
        System.out.println(hash(str2));//48657
        Student stu1 = new Student();
        Student stu2 = new Student();
        System.out.println(hash(stu1));//1
        System.out.println(hash(stu2));//1 (重写了Student类中的hash方法,返回值为1)
【实验】ENSP 实战:酒店有线 + 无线三层组网全配置(VLAN 规划 + AC/AP+SSID 绑定) 三层架构:出口路由器 → 核心交换机 → 汇聚交换机 → 接入交换机 / AP / 终端。 阅读详情

相关推荐

实战指南:在摩尔线程GPU上部署AI模型的完整流程

本文提供了一份详尽的实战指南,手把手教你如何在摩尔线程GPU上成功部署AI模型。内容涵盖从驱动安装、Docker环境配置,到核心的代码适配与模型运行全流程,并分享了性能调优技巧与常见避坑方法,旨在帮助开发者高效利用国产硬件进行AI应用开发。

weixin_29271263的博客 537

java中HashSet的add的使用,以及equals和hashcode的重写

平时学了很多的java知识,但是发现自己经常忘记好多的知识点,我以我打算一边学习一边写博客,其实整个写博客的过程也是我自己巩固学习,熟悉理解的过程,希望热心的朋友多多给我指出错误啊。在此也感谢张龙老师的慷慨分享。 这次讲解一下HashSet中add方法的使用以及许多注意的地方,首先大家知道数据结构分为线性结构和非线性结构,前面讲的ArrayList是线性结构的顺序表示法,LinkedList...

松篁 458

Lumerical官方案例、FDTD时域有限差分法仿真学习(十八)——Y分支粒子群算法优化

组件优化是任何致力于开发高性能光子器件的设计过程的关键步骤。 此绝缘体上硅 Y 分支示例演示了适用于任意优化例程的通用组件形状参数化方法。 此示例中的算法是 Lumerical 的内置粒子群优化 (PSO),可通过用户界面轻松设置。 此外,建议的优化过程展示了如何将 varFDTD 与全 3D FDTD 求解器相结合,以显着减少优化时间,同时保持高精度。

weixin_45719141的博客 1万+

HashSet的add方法的问题

HashSet的add方法的问题昨天敲题,自己写了一个类,然后用Set过滤重复,碰到了equals和hashCode的问题,加之之前面试的时候问到过相关的内容,觉得自己学得还是浅,所以带着疑问有看了看HashMap的代码,将几个问题总结一下.关于HashSet 传入对象,怎么过滤首先,我们知道所有的Set里面都套了一个Map,使用Map的Key存值,Value存放一个固定的Object,这是适配器模

lqadam的博客 1万+

Arcgis中的模型构建器技术之按属性批量建库并对应输出

好久没更新了,之前我们已经介绍过四至点提取模型,前两天有同事问怎么样按属性批量建数据库并对应输出相关图斑。比如将一个县的永农数据按乡镇建立数据库并将对应乡镇的永农数据输出到相应的数据库里。今天就介绍一下相关的模型构建过程。

weixin_44671081的博客 518

ShengBTE热导计算:利用ShengBTE计算热导显示NAN的原因是什么?算出的热导不随平均声子自由程变化

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 963

java HashSet 如何判断元素是否存在

HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素; 如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。 package test2; import java.util.HashS

xavihernandez的博客 1万+

apt-get update时出现GPG error:... bionic InRelease:The following signatures were invalid: EXPKEYS解决方案

本文主要介绍了apt-get update时出现W: GPG error: … bionic InRelease: The following signatures were invalid: EXPKEYSIG B7B3B788A8D3785C MySQL Release Engineering E: The repository ‘… bionic InRelease’ is not signed.解决方案,希望能对使用Ubuntu系统的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

Java中详述HashSet类add方法(二)

hashCode方法 当使用HashSet中的add方法添加重复数据时,返回值为false,欲分析底层源代码,需要进行对HashCode方法进行分析说明。 public class Test1 { static final int hash(Object key) {//在源代码中摘出hash方法进行分析操作。 int h; return (key...

zzu957的博客 705

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

Rockyoung 3321

【DRAM存储器六十一】LPDDR5介绍--LPDDR5/5X/4/4X IO结构

简述LPDDR5/5X/4/4X IO结构及等效电路下的VREF理论值计算

highman110的博客 480

java——详述HashSet类add方法(二)

主程序: import java.util.HashSet; public class Test2 { public static void main(String[] args) { HashSet<String> names = new HashSet<String>(); names.add("Jim"); names.add("Jim");//这篇...

qq_44687512的博客 150

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

详述Java中HashSet类add方法(二)

在HashSet集合中添加两个相同元素: import java.util.HashSet; public class Test { public static void main(String[] args) { HashSet<String> names = new HashSet<String>(); names.add("Jim"); names....

FOREVER_GWC的博客 241

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2、详述HashSet类add方法(二)

向集合中存储重复的元素,源代码解析 package sun6; import java.util.HashSet; public class Test2 { public static void main(String[] args) { HashSet<String> names = new HashSet<String>();//调用构造方法时,创建Hash...

深海潜蛟的博客 159

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

详述HashSet类add方法底层源码(二)

以下面代码为例(添加两个相同的字符串): import java.util.HashSet; public class Test2 { public static void main(String[] args) { HashSet<String> names = new HashSet<String>(); names.add("Jim"); na...

m0_46383618的博客 210

详述:HashSet类add方法(二)

分析代码 import java.util.HashSet; public class Test { public static void main(String[] args) { HashSet<String> names = new HashSet<String>(); names.add("Jim"); names.add("Jim");...

核桃仁先生的博客 207

详述Java中HashSet类add方法(二):添加一个重复元素

在HashSet集合中添加两个相同元素: import java.util.HashSet; public class Test { public static void main(String[] args) { HashSet<String> names = new HashSet<String>(); names.add("Jim"); names....

qq_46384325的博客 1843

详述HashSet类add方法(二):添加第二个相同数据过程

代码: import java.util.HashSet; public class Test2 { public static void main(String[] args) { HashSet<String> names = new HashSet<String>(); names.add("Jim");//https://上一篇如何存储第一个数据:b...

syhfly2333的博客 679

详述HashSet类add方法(二)(Java:集合与泛型(七))

一、概述: 我们之前已经讨论了向一个空的String类型的HashSet对象中添加一个名为“Tom”的元素,本文将讨论再向该对象中添加一个名为“Tom”的情况。 二、底层代码分析: import java.util.HashSet; public class Main { public static void main(String[] args) { HashSet<String> set = new HashSet<String>(); set.add("Tom

weixin_44785966的博客 221
上一篇: 详述HashSet类add方法(一)
下一篇: HashSet集合学生管理系统
CellIce
博客等级 码龄7年 2粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值