java Set HashSet详解,java初级面试笔试题

Map与Set面试题(高频) 目录 1.只出现一次的数字 1.1题目描述 1.2思考过程 1.3代码 2. 复制带随机指针的链表 2.1题目描述 2.2思考过程 2.3代码 3.宝石与石头 3.1题目描述 3.2思考过程 3.3代码 4.旧键盘打字 4.1题目描述 4.2思考过程 4.3代码 5.前K个高频单词 5.1题目描述 5.2思考过程 5.3代码 1.只出现一次的数字 OJ:oj链接 1.1题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出... 阅读详情


我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。
扫描二维码或搜索下图红色VX号,加VX好友,拉你进【程序员面试学习交流群】免费领取。也欢迎各位一起在群里探讨技术。
推荐文章:Java 面试知识点解析;Mysql优化技巧(数据库设计、命名规范、索引优化

 

Set集合

 

就像把对象随意扔进罐子里,无法记住元素的添加顺序。Set某种程度就是Collection,方法没有不同,只是行为稍微不同,(不允许重复元素),如果一定要往里加两个相同元素,添加失败add()返回false;

上面的Set的一些共同点,Hashset,TreeSet,EunmSet三个实现类还各有特色。

依次介绍下

Hashset

判断Hashset 集合里的两个对象相等,过两关,equal()比较相等,对象的hashcode()也相等

为什么还得比较对象的hashcode()?

Hashset 集合收进一个对象时,会调用对象的hashcode()得到其Hashcode值来决定他的存储位置。所以,即使是equal()比较相等的两个对象,hashcode不同,存放在hashset里的位置不同,依然能把这两个对象添加成功。

注意:把对象装进hashset时,如果要重写equals方法,也得重写hashcode 方法,因为equals()相等的两对象hashcode 也是相同的。

提问:hashcode()对hashset是很重要的吗?

答:hash算法是快速查找被检索的对象。通过对象的hashcode定位集合里的对象的存储位置。定位该元素。对比下,数组是存储一组元素最快的数组结构,数组通过索引找到它的组员,通过索引能计算元素在内存里的存储位置。

但是为嘛有了数组,还用hashset呢?数组也有局限性,索引是连续的,而且长度不可变。

hashset有了hashcode,所以能快速定位对象位置,而且任意增加对象。

重写hashcode() 注意java.lang.Object中对hashCode的约定:

两个对象通过equals()比较相等时,他们的hashcode 也应该是一样的。

程序运行过程中,同一个对象多次调用hashcode方法返回应该是一样的。

如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法不一定会生成不同的整数结果。但是,为不相等的对象生成不同整数结果可以提高哈希表的性能。 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。

 

向hashset里添加了一个可变对象后时,要注意:如果后面的程序修改了这个可变对象的实例变量时,可能会导致他与集合里的其他元素相同,即两个对象equals返回true,hashcode也相同。导致hashSet不能正确操作那些元素。

补充了解下,可变对象:创建后,对象的属性值可能会变,也就是说,创建后对象的hash值可能会改变。

举例:对象MutableKey的键在创建时变量 i=10 j=20,哈希值是1291。然后我们改变实例的变量值,该对象的键 i 和 j 从10和20分别改变成30和40。现在Key的哈希值已经变成1931。显然,这个对象的键在创建后发生了改变。所以类MutableKey是可变的。

下面代码是hashset里添加了一个可变对象例子,

可看出,hashset已经添加了几个成员后,修改一个成员的实例变量,会得到里面有相同的成员,因此是不对的。

但是,对最后一行,不能准确访问成员这个。有点疑问,待解决。

 

package Test01;

import java.util.HashSet;

import java.util.Iterator;

class mutClass{

    public int count;

    public  mutClass(int count) {

        this.count =count;

    }

    public  boolean equals(Object obj) {

        if(this == obj) {

            return true;

        }

        if(obj != null && obj.getClass() == mutClass.class) {

            mutClass m =(mutClass) obj;

            return this.count == m.count;

        }

        return false;

    }

    public  int hashcode() {

        return this.count;

    }

    public String toString() {

        return "试试mutClass[count=" + count + "]";

    }

    

}

public class TestHashSet {

   @SuppressWarnings("unchecked")

public static void main(String[] args){

       HashSet testHashSet =new HashSet();

       

       mutClass a = new mutClass(3);

       mutClass b = new mutClass(1);

       mutClass c = new mutClass(-9);

       mutClass d = new mutClass(9);

       testHashSet.add(a);

       testHashSet.add(b);

       testHashSet.add(c);

       testHashSet.add(d);

        System.out.println("第一次"+testHashSet);

        Iterator iterator =testHashSet.iterator();

       mutClass first = (mutClass) iterator.next();

       first.count=9;

      /* testHashSet.remove(new mutClass(3));

       testHashSet.remove(b);    //与上一行的区别

*/       System.out.println("第二次"+testHashSet);

        System.out.println(new mutClass(-9) == new mutClass(-9));

       System.out.println("第四次"+testHashSet.contains(new mutClass(-9)));

    }

}

 

hashset不能保证添加成员的顺序,和自己的顺序是一样的,但是引入了一个LinkedHashSet子类,使得它能和hashset一样,靠hashcode 找到他的存储位置,又能维护添加成员的顺序,内部靠一个链表实现,迭代访问集合时有很好的性能。

 


转载:https://www.cnblogs.com/yizhizhangBlog/p/9258532.html

推荐内容:
java面试题
Java序列化机制原理
详解Java的自动装箱与拆箱(Autoboxing and unboxing)
Java 最常见的 200+ 面试题汇总
JAVA多线程和并发基础面试问答
面试题--JAVA中静态块、静态变量加载顺序
50道Java线程面试题汇总
Java集合---面试题
Java工程师面试题整理[社招篇]
java面试题:Spring

 

Java之HashSet的底层原理:面试常问考点 HashSet 在很多面试中都是一个高频的考点。那么我们看看HashSet面试都问什么? 面试官常问你HashSet的底层数据结构是什么? HashMap ,这个 时候面试官又问HashMap 怎么能对呢? HashMap 是<k,v >的数据结构啊,而HashSet 是一个v的数据结构啊,这个时候面试官会说我觉得你对源码了解的不多。但是其实顶层就是HashMap的数据结构,用Ha... 阅读详情

相关推荐

Java 集合框架:Java 中的 Set 集合(HashSet & LinkedHashSet & TreeSet)特点与实现解析

Set是java.util包下集合框架中一个接口,它是Collection接口的一个子接口,表示不允许包含重复元素的集合。Set 集合的特点是集合内的元素无序,且每个元素都是唯一的。这意味着即使试图添加两个相等的对象(依据.equals()方法判断相等),Set 集合只会保存一个对象。无序性:Set 集合中的元素不按任何特定顺序排列,无法通过索引访问元素,即集合内部的元素顺序可能随时间和操作发生变化;唯一性:Set 集合不允许包含重复的元素。判断元素是否重复的标准是基于元素的.equals()方法。

栗筝i的博客 8916

HashSet详解

HashSet详解

weixin_52385232的博客 1万+

用电脑通过网口控制keysight示波器

Keysight HD304MSO示波器提供1GHz带宽、14位高精度ADC及10.1英寸触控屏,支持50μV低噪声信号捕获和1.3M波形/秒刷新率。配备4通道探头、逻辑分析仪接口及100Mpts存储深度,含故障诊断、FFT等高级功能。通过网线连接电脑安装TightVNC软件(示波器IP为169.254.163.24)可实现远程控制,相比U盘传输更高效。(149字)

johnboat的专栏 1136

HashSet的详细介绍

哈希冲突指的是不同的元素通过哈希函数计算得到相同的哈希值,从而导致它们在哈希表中被映射到相同的数组索引位置。在哈希表中,通过哈希函数将元素映射到数组的索引位置。理想情况下,每个元素都应该通过哈希函数计算得到唯一的哈希值,并被映射到不同的数组索引上,这样可以达到快速的查找和插入操作。然而,在实际情况中,由于哈希函数的计算过程无法避免的会产生冲突。哈希函数的输出空间是有限的,而输入空间是无限的,这就意味着不同的元素可能会产生相同的哈希值。当不同的元素经过哈希函数计算后得到相同的哈希值时,就会发生哈希冲突。

橙子的博客 2586

手把手教你用AirSim生成无人机训练数据集:RGB/深度图/分割图全攻略

本文详细介绍了如何使用AirSim仿真插件在UE4环境中生成无人机训练数据集,涵盖RGB、深度图和分割图等多种模态数据的采集与处理。通过实战指南,读者可以掌握环境配置、多模态数据采集、自动化流程设计及数据后处理等关键技术,为无人机视觉算法开发提供高质量训练数据。

weixin_29008805的博客 449

螺丝锁付系统软件设计 C# Winform

视觉螺丝锁付系统软件设计 C# Winform ,这是其中通信子模块设计

weixin_42522973的博客 340

Set相关的两道面试题

题目1:在List内去除重复数字值,要求尽量简单 public List duplicateList(List list) { HashSet set = new HashSet(); set.addAll(list); return new ArrayList(set); } @Test public void test19() { List list = new ArrayList(); list.add(new Integer(1)); list.add

Yu's Blog 562

从零开始:在Ubuntu 22.04上配置Isaac Gym Preview 3环境(含常见错误解决方案)

本文提供了在Ubuntu 22.04系统上从零开始配置Isaac Gym Preview 3环境的完整实战指南。内容涵盖NVIDIA驱动安装、Conda环境搭建、CUDA与PyTorch版本精准匹配、Isaac Gym核心安装与验证,并重点介绍了针对四足机器人等复杂系统的强化学习训练环境配置、常见错误解决方案及性能调优技巧,旨在帮助开发者高效部署这一高性能物理仿真平台。

weixin_29048775的博客 393

Java进阶(Set)——面试时Set常见问题解读 & 结合源码分析

本篇博客介绍常见的关于Java中Set集合的面试问题,结合源码分析题目背后的知识点。

Arya的博客,专注后端领域 865

ComfyUI中一个超好用的变量管理类节点-KJNodes

在AI绘图中,ComfyUI的热度开始慢慢起来一些,但是这个软件在使用的过程中,需要很多连线,仅仅一个最简单的动画生成,就需要连接这么多线条,而且有些线会飞的很远,看起来就很不美观,尤其是一些复杂工作流,连接到最后自己可能已经分不太清楚到底连接好了没有。今天在研究C站的大佬们的工作流的时候,发现一个有意思的工作流,看起来大概是这种感觉:干净整洁。他用到了KJNodes这么个节点来管理变量,git上星标也不算很多,所以我想很多朋友可能还不知道,所以这里简单介绍下用法。

聚梦小课堂 7521

FPGA调试利器:VIO与ILA在Vivado中的实战应用指南

本文详细介绍了Vivado中FPGA调试工具VIO与ILA的实战应用技巧。VIO作为虚拟输入/输出工具,可实时调整参数;ILA作为集成逻辑分析仪,能高效捕获内部信号。文章通过具体案例展示了如何配置ILA采样深度、触发条件,以及VIO的动态参数调整功能,帮助开发者提升上板调试效率,解决常见通信失败、数据不同步等问题。

weixin_42553471的博客 424

HashMap与HashSet的区别:Java面试必备知识点

本文对比分析了Java中HashMap和HashSet的核心区别。HashMap实现Map接口存储键值对,使用put()方法添加元素,通过键对象计算哈希值,不允许重复键但允许重复值;HashSet实现Set接口仅存储对象,使用add()方法添加元素,通过成员对象计算哈希值,不允许任何重复元素。关键区别在于HashSet内部实际通过HashMap实现(元素作为键,固定对象作为值)。使用场景上,HashMap适合键值映射和快速查找,HashSet适合去重和集合运算

ywl470812087的博客 10万+

【CanMV K210】AI 视觉 MNIST 手写数字识别与分类推理

本文介绍了基于CanMV K210开发板的MNIST手写数字识别实验。实验通过摄像头采集图像,经过开窗、灰度化、缩放、反色等预处理后,使用KPU神经网络加速器运行MNIST分类模型,最终在LCD上显示识别结果。重点讲解了分类模型与检测模型的区别、图像预处理流程以及KPU推理结果的解析方法。实验帮助理解从图像采集到分类输出的完整AI视觉处理链路,并提供了调试思路和硬件连接说明。

Mr数据杨 366

Java集合Set详解:从入门到精通

本文是一篇关于Java Set集合框架的深度解析指南,主要内容包括: 1️⃣ Set集合概述:介绍Set的特点(元素唯一性)及其与List的区别,展示Java Set体系结构(HashSet、LinkedHashSet、TreeSet等)。 2️⃣ 三大Set实现详解: HashSet:基于HashMap实现的无序集合,通过hashCode()和equals()保证唯一性 LinkedHashSet:保留元素插入顺序的有序集合 TreeSet:基于TreeMap实现的有序集合(自然排序或定制排序) 3️⃣

2301_79751930的博客 1347

【docker】第10篇 Failed with result ‘exit-code和Start request repeated too quickly和Failed to start Docker

【docker】解决 Failed with result 'exit-code'和Start request repeated too quickly和Failed to start Docker。

Fanjufei的博客 6819

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java面试题之HashSet 的实现原理?

HashSet 的实现原理? 首先,我们需要知道它是Set的一个实现,所以保证了当中没有重复的元素。 一方面Set中最重要的一个操作就是查找。而且通常我们会选择 HashSet来实现,因为它专门对快速查找进行了优化。 HashSet使用的是散列函数,那么它当中的元素也就无序可寻。当中是允许元素为null的。 先对实现原理进行一个总结: (1)基于HashMap实现的,默认构造函数是构建一个初始容量...

qq_41026809的博客 9182

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!

面试官:那TreeSet要怎么定制排序?TreeSet的自定义排序我们要利用Comparator接口,通过向TreeSet传入自定义排序规则的Comparator来实现。官方源码是这么解释的,南友们看一看。// 构造一个新的空树集,根据指定的比较器进行排序。// 插入到集合中的所有元素都必须能够通过指定的比较器相互比较: comparator. compare(e1, e2)不得对集合中的任何元素e1和e2抛出ClassCastException。

JavaSouth南哥 2057

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?

HashSet、LinkedHashSet 和 TreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的。HashSet、LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同。HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。

JavaBuild的博客 1507

Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day3】 —— 集合框架1

百日闭关修炼,每日三道高频面试题。一起冲进大厂!看什么看?快上车!

陈哈哈的菜园子 1万+

Java基础 集合框架 之set框架之HashSet

Java基础 集合框架 之set框架之HashSet

骑牛小道士 1174

Java集合类面试题: Collection 接口(List、Set)

收集大量Java经典面试题目,内容涵盖了包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 等知识点。适合准备Java面试的读者参考和复习。

m0_46013789的博客 1395

Java Map和Set

HashMap是线程不安全的,因为采用了头插法,后面采用了尾插法变得安全了,ConcurrentHashMap是线程安全的,之后学到了线程就可以理解了。如果key是String,Person类型就不能除以数组的长度了,该怎么找到对应的下标呢?4. 扩容之后需要重新哈希,因为数组长度变了,要重新计算节点存放的位置。如果频率相同放入堆中要使用大根堆,要让love排在i的前面。5. 遍历哈希数组中每个数组元素,都要重新计算节点位置。cur是某个节点的左边。cur是某个节点的右边。要删除的节点是cur。

的博客 1994

Java [ 基础 ] Set 集合详解 ✨

HashSetTreeSet和是Set接口的三种常用实现。选择哪种实现类取决于具体的需求:如果需要高效的查找操作,选择HashSet;如果需要有序的集合,选择TreeSet;如果需要按插入顺序访问元素,选择。理解它们的特点和使用场景能够帮助我们更好地处理集合操作。

lenyan~的博客 1057

java中的Set系列集合:HashSet、LinkedHashSet、TreeSet

●无序(不代表乱序)●不可重复(不能存储重复元素),●没有索引,不能用普通的for进行遍历,但是能用迭代器或者增强for循环进行遍历● 底层采用数组+链表+红黑树的结构形式来存储数据,其实就是用HashMap的key键来存储数据,在创建HashSet对象的时候就会创建一个HashMap来存储数据(如下图),所以其采用HashMap存储数● 扩容机制:① 当底层数组长度大于等于阈值的时候② 当链表长度大于等于8的时候,并且数组长度小于64。

weixin_65378964的博客 1111

Java基础 集合-Set之HashSet

Set接口的常用方法 和List接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样 Set接口的遍历方式 同Collection的遍历方式一样,因为Set接口是Collection接口的子接口 1)可以使用迭代器 2)增强for 3)不能使用索引的方式来获取 //1.以set接口的实现类 HashSet来说明Set接口的方法 //2.set接口的实现类的对象(Set接口对象),不能存放重复的元素,可以添加一个null //3.set接口对象存放

sun1995sun的博客 1297
上一篇: Java大数处理,java开发面试笔试题
下一篇: Java生成静态HTML文件,java初级面试笔试题
ccc_ccc8
博客等级 码龄8年 8粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值