【JavaSE】Java(五十七):核心要点总结

news2024/11/24 9:35:09

文章目录

  • 1. HashMap 的实现原理
  • 2. Set 有哪些实现类
  • 3. HashSet 的实现原理
  • 4. 如何实现数组和List之间的转换
  • 5. Java中的迭代器


在这里插入图片描述

1. HashMap 的实现原理


HashMap 是一种基于哈希表的数据结构,它的实现原理简单来说就是将键值对存储在一个数组中,并通过哈希算法计算出每个键对应的下标。下面是 HashMap 实现原理的具体步骤:

  • 初始化:创建一个长度为 n 的数组(初始默认长度为 16),该数组每个位置可存放一个链表;以及一个负载因子(load factor),用来表示哈希表允许填充的程度。

  • 存储数据:通过哈希函数将每个键转化成一个唯一的、固定的索引(下标)位置,并将对应的键值对存储到哈希表中。如果发生哈希冲突(即多个键映射到了同一个位置),则会将这些键值对以链表的形式存储在这个位置上。当某个位置上的链表长度超过指定阈值(8)时,这个链表就会被转化成红黑树,并以红黑树的方式存储和管理。

  • 扩容与重新哈希:当哈希表中的元素个数达到负载因子与数组长度的乘积时,哈希表就会触发扩容操作。扩容的本质是创建一个新的、长度为 2n 的数组,并将原有的键值对重新哈希到新的数组中。

  • 计算哈希值:对于键是引用数据类型的情况,不同对象在内存中占据的位置不同,因此不同的对象可能会生成相同的 hashcode。为避免 key 的 hashcode 造成碰撞问题,HashMap 在处理 hashcode 值碰撞时,会再次根据 hashcode 进行比较,以确定正确的值。

HashMap 底层实现采用了数组、链表和红黑树等数据结构,并且通过哈希算法实现键值对的快速查找和增删操作。

2. Set 有哪些实现类


Set 是 Java 中的一种集合数据类型,它存储的元素是无序且不可重复的。Java 中提供了多种 Set 的实现类,并且每个实现类都有自己的特点和应用场景。下面列出几种常见的 Set 实现类:

  • HashSet:基于哈希表实现,可以快速地查找、插入和删除元素,具有较高的性能。存储的元素是无序的,且由于使用哈希表作为底层数据结构,所以不保证元素的顺序一定不变。

  • LinkedHashSet:基于哈希表和链表实现,具有 HashSet 的查询操作速度,并且内部使用链表维护了元素的顺序。因此,遍历该集合时会按添加顺序或访问顺序进行迭代。

  • TreeSet:基于红黑树(一种自平衡二叉搜索树)实现,可以自动对元素进行排序,存储的元素是有序的。它还提供了一些用于操作有序集合(例如获取子集和范围查找)的方法。

  • EnumSet:这是一个专门用于枚举类型的 Set 实现类,在 Java 5 中引入。该类具有非常好的性能和空间效率,它是通过一个位向量来表示 Set 中每个可能值的出现情况。

  • CopyOnWriteArraySet:该类是线程安全的 Set 实现类,它通过对底层数组进行复制来实现并发修改。在读操作频繁、写操作较少的场景下,该类的性能表现较好。

选择 Set 的实现类应根据具体业务需求和使用场景,考虑性能、空间占用、数据排序等方面的因素。

3. HashSet 的实现原理


HashSet 是 Java 中 Set 接口的一个实现类,它基于哈希表(Hash Table)数据结构实现。具体来说,HashSet 底层维护了一个哈希表,用于存储集合中的元素。

以下是 HashSet 的实现原理:

创建 HashSet 实例时,会创建一个初始容量为16,并且负载因子为0.75的空的哈希表(数组),并根据默认的哈希算法计算每个元素在哈希表中的桶(bucket)位置。

往 HashSet 中添加元素时,会先对元素的 hashCode 值进行哈希计算,然后将元素加入到对应的桶中。如果哈希表中已经有元素占据了该桶,则采用链表或红黑树等数据结构,在该桶中维护这些元素。

当哈希表中的元素个数超过容量与负载因子的乘积时,就会触发扩容操作。此时,系统将会重新生成一个两倍大小的哈希表,同时将所有现有元素重新哈希分布到新表中,以保证哈希性质不变。

在查找 HashSet 中某个元素时,首先通过 hashCode 计算出该元素所在的桶,然后根据 .equals() 方法比较元素是否相同。如果多个元素都映射到了同一个桶,则遍历链表或红黑树等数据结构寻找目标元素。

HashSet 通过哈希表建立了 key-value 的映射关系,能够实现高效的查询、插入和删除操作。但由于哈希函数并不是唯一且完美的,所以可能会出现哈希冲突和扩容后的额外开销等问题。

4. 如何实现数组和List之间的转换


Java 中可以通过以下方法实现数组和 List 之间的转换:

  1. 数组转 List
    // 使用 Arrays.asList 方法将数组转换为 List
    Integer[] arr = {1, 2, 3};
    List<Integer> list = Arrays.asList(arr);
    

注意:使用 asList 方法转换后返回的是一个固定长度的 List,不能进行 add、remove 等修改操作。如果需要对 List 进行修改,可以使用 ArrayList 等可变长度的 List 实现。

  1. List 转数组
    // 使用 toArray 将 List 转换为数组
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    Integer[] arr = list.toArray(new Integer[list.size()]);
    

注意:需要将 List 的泛型类型作为参数传递给 toArray 方法,并将数组初始化为指定的长度,避免出现空指针异常。

除了上述方法,还可以使用 Java8 中引入的 Stream API 以及 Guava、Apache Commons 等第三方库中提供的工具类来实现数组和 List 之间的转换。

5. Java中的迭代器


Java 中的迭代器(Iterator)是一种用于遍历集合(Collection)元素的接口,它提供了 hasNext() 和 next() 两个方法,可以依次访问集合中的每个元素。

使用 Iterator 能够实现对集合的遍历和操作,而无需关心内部数据结构和实现细节。具体来说,可以通过以下步骤使用 Iterator 对集合进行迭代:

  1. 获取集合的迭代器

    List<String> list = new ArrayList<>();
    Iterator<String> iterator = list.iterator();
    
  2. 使用 while 循环遍历集合中的元素,直到 hasNext() 返回 false

    while (iterator.hasNext()) {
        String str = iterator.next();
        // 对当前元素进行操作
    }
    
  3. 在循环中调用 next() 方法获取下一个元素,同时更新迭代器状态,直到所有元素都被遍历完毕。

由于 Iterator 可以遍历任何实现了 java.util.Collection 接口的集合类,因此可以方便地操作各种类型的集合。同时,Iterator 还提供了 remove() 方法,可以在遍历过程中删除集合中的特定元素。

需要注意的是,Iterator 遍历集合时,不支持并发修改(Concurrent Modification),即如果在遍历过程中对集合进行了增加、移除等操作,可能会导致抛出 ConcurrentModificationException 异常。为了避免这种情况,可以使用并发集合类(如 ConcurrentHashMap)或使用显示锁(如 ReentrantLock)等方式进行同步。



在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解深度学习——注意力机制(Attention Mechanism):自注意力(Self-attention)

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

强化服务器安全!CentOS 7如何使用fail2ban防范SSH暴力破解攻击?

前言 本文主要讲解centos7操作系统下&#xff0c;如何使用fail2ban防范SSH暴力破解。 &#x1f3e0;个人主页&#xff1a;我是沐风晓月 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是沐风晓月&#xff0c;阿里云社区博客专家 &#x1f609;&#x1f609; &#x1…

如何使用Python生成跑马灯视频

在这篇博客中&#xff0c;我将向您展示如何使用Python语言生成一个简单的跑马灯视频。我们将使用OpenCV和Pillow两个库来实现这个功能。 安装依赖库 首先&#xff0c;我们需要安装opencv-python和Pillow两个库。您可以使用以下命令来安装它们&#xff1a; pip install opencv…

Navicat 设置PostgreSQL数据库的表主键ID自增

文章目录 1 新建序列1.1 手动新建1.2 SQL语句新建 2 设置主键自增 1 新建序列 1.1 手动新建 选择 其他->序列 选择一个模式&#xff08;例如public&#xff09;&#xff0c;然后选择新增序列。 设置序列参数 刷新序列列表即可看到新建的序列 注意&#xff1a; 序列的最大…

C语言实现2048小游戏

大部分同学学习C语言编程以后不知道能通过什么样的项目才可以锻炼自己的思维功力&#xff0c;2048相信大家都应该熟悉&#xff0c;不管是手机上还是网页版的相信大家都玩过,这个简单的控制台版本的游戏是我曾经在伟易达上班时一个嵌入式应用游戏部门的大佬设计的&#xff0c;适…

简单使用gateway,以及gateway所需要的依赖

先声明&#xff0c;使用gateway需要有一定的SpringCloud的基础&#xff0c;再来使用时会看的很明白&#xff0c;使用前需要先开nacos服务&#xff0c;&#xff0c;确定无误。 下面直接开始 首先我们需要两个原来通信的模块&#xff0c;这里分别是service-const与service-provid…

《导航帖》-全系列软考A计划

专栏分享 点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 文章目录 &#x1f449;关于作者&#x1f449;前提&#x1f449;链接追踪&#x1f449…

高通 Camera HAL3:项目开发技术点总结

做高通 Camera HAL3开发的一些技术点的总结、整理。 做个记录&#xff0c;方便后续查阅。 1.目录、so、配置文件 productName是项目名 out Target路径&#xff1a;\out\target\product\productName\chi-cdk&#xff1a;\vendor\qcom\proprietary\chi-cdk\ldc node&#xff1…

【Hive】安装配置及导入Hdfs数据

知识目录 一、写在前面&#x1f495;二、Hive的安装与配置✨2.1 Hive简介2.2 上传与解压2.3 拷贝MySQL驱动2.4 hive-site.xml文件2.5 启动hive 三、导入Hdfs数据到Hive✨3.1 修改Hadoop集群配置3.2 初始化3.3 创建表3.4 从Hdfs导入数据 四、总结撒花&#x1f60a; 一、写在前面…

【Leetcode】贪心 区间问题 | 用最小数量的箭引爆气球、无重叠区间、划分字母区间、合并区间

452 用最少数量的箭引爆气球 更像一个重叠区间问题&#xff0c;贪心策略&#xff1a;应该在重叠最多处射出。 按区间左端点递增序进行排序&#xff0c;左端点相同时&#xff0c;按右端点递增序排序。 现在欲射穿气球 i i i&#xff0c;当发现相邻的两个区间有重叠时&#xff…

[230604] 听力TPO66汇总·上篇| C1 L1 C2|10:20~12:00

目录​​​​​​​ Science Fiction And Sci-fi-C1 错题分析 C1-3 细节双选题 C1 精听练习 做题笔记 Financial Advice-C2 全对 C2 精听练习 Sleep-L1 错题分析 L1-4 细节题 L1-5 细节双选题 L1 精听练习 做题笔记 词汇&#xff1a;http://t.csdn.cn/Zhuws 两篇对…

编译型语言与解释型语言的区别

用比喻来明编译型语言和解释型语言的区别&#xff1a; 假设你要理解一本书&#xff08;源代码&#xff09;将转化为一篇演讲稿&#xff08;机器代码&#xff09;。 编译型语言类似于你将整本书翻译成一篇演讲稿。你需要在事先对整本书进行翻译&#xff0c;将其转化为一份完整…

chatgpt赋能python:Python如何使用while函数倒序输出数字?

Python如何使用while函数倒序输出数字&#xff1f; Python是一种高级编程语言&#xff0c;它易于学习、易于使用&#xff0c;这使得它成为了非常受欢迎的编程语言之一。Python在各种应用程序中都有着广泛的应用&#xff0c;从Web开发到数据分析&#xff0c;甚至是人工智能等领…

脑疾病患者福音,又一家脑机接口公司完成首次人体试验

近日&#xff0c;脑机接口公司Precision Neuroscience宣布完成其神经植入系统的首次人体临床试验&#xff0c;该公司设计的植入系统在1平方厘米的面积上有1024个微型电极&#xff0c;这些电极被嵌入到与大脑表面一致的柔性薄膜中。这种薄膜只有人类头发厚度的五分之一&#xff…

chatgpt赋能python:Python中如何倒着输出字符串

Python中如何倒着输出字符串 在Python编程中&#xff0c;字符串是一种不可避免的数据类型&#xff0c;我们往往需要对字符串进行各种操作。其中&#xff0c;倒着输出字符串是一项基本的操作&#xff0c;对于初学者来说&#xff0c;可能并不是很容易理解。本文将介绍如何使用Py…

【算法题001】面试题 01.01. 判定字符是否唯一

题目来源&#xff1a;《程序员面试金典&#xff08;第 6 版&#xff09;》 1、Problem: 面试题 01.01. 判定字符是否唯一 文章目录 面试题 01.01. 判定字符是否唯一一、题目描述二、解决方案&#xff08;一&#xff09;方案一1、解题思路2、解题方法3、复杂度4、代码实现 &…

二本4年Java经验,大佬五面阿里(定薪45K)

前段时间刚面试上岸&#xff0c;先后面试了各大小公司&#xff0c;拿了一些 offer&#xff0c;有阿里&#xff0c;滴滴&#xff0c;快手&#xff0c;达达&#xff0c;得物等公司。面试的公司大部分都能过&#xff0c;所以这里给大家分享下自己的经验&#xff0c;也给自己做个归…

地震勘探基础(十二)之地震偏移处理

地震偏移处理 地震数据常规处理主要包括地震反褶积&#xff0c;水平叠加和地震偏移成像三大类。地震反褶积通过压缩地震子波提高地震分辨率&#xff0c;水平叠加的目的是提高信噪比&#xff0c;地震偏移成像的目的是提高地震空间分辨率和地震保真度。 在20世纪50年代&#xf…

【1】Midjourney新手必读

Midjourney官网网站&#xff1a;https://www.midjourney.com/ 问题一&#xff1a;Midjourney是什么 Midjourney 是 AI 生成算图工具&#xff0c;输入文字就会自动产生图像&#xff0c;目前架设在Discord频道上。 问题二&#xff1a;Discord频道是什么 Discord是国外的一个社…

Matlab快速入门——数组

学习目标&#xff1a;学习关于数组的详细知识&#xff08;喜欢的别忘记点赞收藏呦&#xff09; clear all; A[] %空数组 B[5 6 5 4 1] %行向量 C[5,5,5,4,4] %行向量 D[3;3;3;3;5] %列向量 EC %对行向量转置得到列向量 clear all…