首页 > 其他分享 >11-HashSet

11-HashSet

时间:2024-09-08 19:02:38浏览次数:9  
标签:11 HashSet 19 hs add Student new

HashSet

特点

  1. 放入Integer类型数据

            //创建一个HashSet集合:
            HashSet<Integer> hs = new HashSet<>();
            hs.add(19);
            hs.add(5);
            hs.add(20);
            hs.add(19);//存重复数据
            hs.add(41);
            hs.add(0);
            System.out.println(hs.size());//6个数据,只存了5个
            System.out.println(hs);//[0, 19, 20, 5, 41] 唯一,无序
            //注:数据重复储存,只有第一个数据被存入。
    
  2. 放入String类型数据

            HashSet<String> hs = new HashSet<>();
            hs.add("hello");
            hs.add("apple");
            hs.add("banana");
            hs.add("html");
            hs.add("apple");
            hs.add("css");
            System.out.println(hs.size());//5
            System.out.println(hs);//[banana, apple, css, html, hello]
    
  3. 放入自定义的引用数据类型的数据:

            HashSet<Student> hs = new HashSet<>();
            hs.add(new Student(19,"lili"));//之前Integer和String不用对象是因为自动装箱
            hs.add(new Student(20,"lulu"));
            hs.add(new Student(18,"feifei"));
            hs.add(new Student(19,"lili"));
            hs.add(new Student(10,"nana"));
            hs.add(new Student(11,"jiejie"));
            System.out.println(hs.size());//6
            System.out.println(hs);//发现两个lili都存入了!
    //输出:[Student{age=18, name='feifei'}, Student{age=10, name='nana'},
    // Student{age=20, name='lulu'}, Student{age=19, name='lili'},
    // Student{age=19, name='lili'}, Student{age=11, name='jiejie'}]
    
    • 上面自定义的类型不满足 唯一,无序的特点。为什么呢?、

    因为Student没有重写hashCode和equals(底层原理分析)

简要底层原理

  • 底层=数组+链表
  • 数组都有下标
  • 存入的数据--->每一个数据通过hashCode计算哈希值(这里Integer类型的哈希值与存入的数据一样)
  • 把每个数据的哈希值通过一个表达式计算出存入底层数组的下标(可能不同哈希值算出一样的)
  • 分别将数据存入对应下标的数组中
    • 若存入时,该位置有数据---->要存入的数据与该数据做比较(equals方法)
    • 若相等,则不存入(相当于丢弃)
    • 若不等,在此位置追加出一个链表,将要存入的数据放在链表处(上图11与19)

疑问

  • 底层数组长度是多少
  • 数组的类型是上面
  • hashCode,equals方法真的调用了吗
  • 哈希值和一个表达式算出存放位置,底层表达式是什么
  • 同一个位置的不同数据是向前放还是向后放(是19后加链表11;还是11后加链表19)
  • 放入数组中的数据,是直接放的吗,是否封装成对象了

标签:11,HashSet,19,hs,add,Student,new
From: https://www.cnblogs.com/Mc9r4dy/p/18403277

相关文章

  • 20240911_220441 公共基础 线性链表
    什么是线性链表单向线性链表双向线性链表带链的栈带链队列线性链表的运算循环链表考点小结习题c习题a习题b习题c......
  • 图论篇--代码随想录算法训练营第五十三天打卡| 110. 字符串接龙,105.有向图的完全可达
    110.字符串接龙题目链接:110.字符串接龙题目描述:字典strList中从字符串beginStr和endStr的转换序列是一个按下述规格形成的序列: 序列中第一个字符串是beginStr。序列中最后一个字符串是endStr。 每次转换只能改变一个字符。 转换过程中的中间字符串必须是字典......
  • Windows 11 登录后黑屏,只有一个可以移动的鼠标
    Windows11登录后黑屏,只有一个可以移动的鼠标,但是还能打开任务管理器,点击任务管理器顶部的“文件”>“运行新任务”按钮,按以下步骤操作:→输入:msconfig(按下Enter键)点击上面的“服务”勾选下面的“隐藏所有Microsoft服务”(请务必勾选)点击“全部禁用”。然后回到任务管......
  • 9.8 模拟赛(炼石计划 11 月 11日 CSP-S 十连测 #9)
    炼石计划11月11日CSP-S十连测#9【补题】-比赛-梦熊联盟(mna.wang)\(100+60+20+15=195\)。复盘顺序开题。T1是二分板子。写之前思考好了所有代码细节直接写代码。一遍过了所有大样例。T2。题意好麻烦。\(35\)分是极易的。跳过\(25\)分部分分,直接想正解。有......
  • 运用DBLINK与数据泵导数据时报错ORA-39006、ORA-39113、PLS-00352、PLS-00201、ORA-39
    问题描述:运用DBLINK与数据泵导数据时报错ORA-39006、ORA-39113、PLS-00352、PLS-00201、ORA-39097,如下所示:数据库:源端oracle12.2.0.1目标端:oracle12.2.0.11、问题重现[oracle@hisdb1scripts]$tail-500fnohup.outImport:Release12.2.0.1.0-ProductiononFriSep......
  • 20240911_190441 公共基础 栈
    什么是栈栈的特点栈的出入演练习题31习题30习题b习题b习题习题a习题c......
  • 【C++11及其特性】智能指针——shared_ptr
    大家好,这里是国中之林!❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看←shared_ptr目录一.共享性智能指针二.shared_ptr的共享原理三.shared_ptr的构造函数1.普通的2.数组的3.带删除器......
  • 题解:P11020 「LAOI-6」Radiation
    我们发现一种最优策略,把石头按照斜线摆,即(1,1),......
  • C++11/14/17/20 新特性反汇编分析1
    区间for迭代类似于java中的foreach看个例子:数组的区间for迭代我们从第一行开始看,首先把数组a的地址放到eax中,再把eax的值放到[ebp-28h]中,也就是[ebp-28h]存储了元素的首地址,同理[ebp-34h]也存了a的首地址(这里猜测可能是多个变......
  • P11019 「LAOI-6」[太阳]] 请使用最新版手机 QQ 体验新功能 题解
    非常简单的模拟题。由题意得,即找出输入字符串中,用[]围起来的片段中的大写字母\(A_1,A_2,A_3...A_n\)然后将其转换为小写输出\(/a_1a_2a_3...a_n\)即可。#include<bits/stdc++.h>#defineseq(q,w,e)for(intq=w;q<=e;q++)#definelllonglongusingnamespace......