day4,day5 -java集合框架

List、Set、Map等常用集合类的特点和用法。

在这里插入图片描述

常用集合类(List、Set、Map 等)是 Java 中提供的数据结构,用于存储和操作一组数据。以下是它们的特点和用法:

  1. List(列表):
    • 特点:有序集合,允许重复元素。
    • 用法:常用的实现类有 ArrayList 和 LinkedList。可通过索引访问元素,支持添加、删除和修改操作。适用于需要维护元素顺序且可能包含重复元素的场景。

ArrayList:

  • 特点:基于数组实现的动态数组,支持快速随机访问。
  • 用法:适用于频繁访问和更新元素的场景,但在插入和删除元素时效率较低。

LinkedList:

  • 特点:基于链表实现的双向链表,支持快速插入和删除操作。
  • 用法:适用于频繁插入和删除元素的场景,但在随机访问元素时效率较低。
  1. Set(集合):
    • 特点:无序集合,不允许重复元素。
    • 用法:常用的实现类有 HashSet 和 TreeSet。不保持元素插入顺序,不允许重复元素的存在。适用于需要去重的场景。

HashSet:

  • 特点:基于哈希表实现的无序集合,不允许重复元素。
  • 用法:适用于需要快速查找和去重的场景,但不保持元素的插入顺序。

TreeSet:

  • 特点:基于红黑树实现的有序集合,不允许重复元素。
  • 用法:适用于需要按照自然排序或自定义排序方式对元素进行排序的场景。
  1. Map(映射):
    • 特点:键值对的集合,键和值可以都是任意对象,键不允许重复。
    • 用法:常用的实现类有 HashMap 和 TreeMap。通过键来获取值,键是唯一的,适用于需要根据键查找值的场景。

HashMap:

  • 特点:基于哈希表实现的键值对集合,键和值可以为 null。
  • 用法:适用于快速查找和存储键值对的场景,根据键来获取值,不保持插入顺序。

TreeMap:

  • 特点:基于红黑树实现的有序映射,键不允许为 null。
  • 用法:适用于需要按照自然排序或自定义排序方式对键值对进行排序的场景。

1.List、Set 和 Map 之间有什么区别?它们的常用实现类有哪些?

List、Set和Map是Java集合框架中的三个核心接口,它们之间的区别如下:

List:
list是有序可重复的集合接口,可以按照顺序或者指定的顺序访问和操作元素,还可以通过索引访问元素
常用实现类:ArrayList、LinkedList
Set:
set是无序不重复的集合接口,不能通过索引访问元素。
常用实现类:HashSet、TreeSet
Map:
map是键值对映射的集合接口,每个键只能对应一个值。键值均可以为空
常用实现类:HashMap、ConcurrentHashMap

2.ArrayList 和 LinkedList 的区别是什么?它们适用于不同的场景吗?

ArrayList:底层是数组,查询快增删慢,可以通过索引随机访问,时间复杂度是O(1),
LinkedList: 底层是链表,查询慢增删块,不能使用索引访问,需要从头结点或者尾结点开始遍历,时间复杂度为O(n)

ArrayList适用于需要快速随机访问元素的场景,例如需要频繁地根据索引读取或修改元素的情况。
LinkedList适用于需要频繁进行插入和删除操作的场景,特别是在中间或开头进行插入和删除操作比较多的情况。
对于大部分常见的情况,ArrayList的性能要优于LinkedList,因为数组的访问速度更快。
但在某些特定的场景下,LinkedList可能会更适合,例如需要频繁进行插入和删除操作,并且对于随机访问的性能要求较低的情况。

3.HashSet 和 TreeSet 的区别是什么?它们如何保证元素的唯一性?
HashSet的底层是hash表且是无序不重复的集合接口
TreeSet的底层是红黑树,是有序不重复的集合接口

为了保证元素的唯一性,HashSet和TreeSet在判断元素是否重复时,依赖于元素的equals方法(和哈希码)

在选择HashSet和TreeSet时,需要根据具体的需求进行选择:
如果只关心元素的唯一性,而不关心元素的顺序,可以选择HashSet,它的插入、删除和查找操作的性能较好。
如果需要对元素进行排序,可以选择TreeSet,它会根据元素的顺序进行存储,但由于需要维护红黑树的平衡性,插入、删除和查找操作的性能稍低于HashSet。
总结:HashSet和TreeSet都可以保证元素的唯一性,HashSet适用于无序需求,而TreeSet适用于有序需求。

4.HashMap 和 HashTable 的区别是什么?它们的线程安全性如何?
HashMap是非线程安全的,存储的键和值都可以为null
而HashTable是线程安全的,存储的键和值都不可以为null
HashMap的性能通常比HashTable更好。

5.ConcurrentHashMap 是如何实现线程安全的?它与 HashMap 的区别是什么?
实现线程安全的几个关键点:
ConcurrentHashMap内部使用了分段式的锁,将整个数据结构分成一些独立的部分,并称为“段”并对不同的段进行了锁的力度的控制。还使用了volatile关键字来确保可见性,确保当一个线程修改了某个段的内容后,其他线程可以立即看到修改的结果。还使用并发安全的数据结构(hashEntry数组和链表)与线程安全的迭代器
与HashMap相比,ConcurrentHashMap的区别如下
ConcurrentHashMap是线程安全的,可以在多线程环境下进行并发操作,而HashMap是非线程安全的。在并发环境下,ConcurrentHashMap的性能通常比HashMap好,因为它通过分段锁的机制允许多个线程同时进行读操作,提高了并发性能。

线程安全的集合

1.常见的集合中的线程安全集合
在这里插入图片描述

List

1.Vector
原理是为其所有需要线程安全的方法都添加了synchronize关键字,锁住了整个对象(使用的互斥锁)
2.CopyOnWriteArrayList
在多线程中,读操作跟普通的ArrayList没有区别,写操作会上锁,上锁后将数据复制一份,再将数据写入,避免数据覆盖而造成的数据问题(使用读写锁)

Set

1.CopyOnWriteArraySet
底层使用的是CopyOnWriteArrayList

Queue

1.ConcurrentListedQueue
线程安全,读写效率高的队列,高并发情况下性能最好
其使用CAS比较交换算法来实现线程安全,其添加对象时涉及三个核心参数(V,E,N)
V:当前需要更新的变量,E:预期值,N:新值
只有当V=E时,才会将V=N,否则表示已经被别的线程更新,取消当前操作
2.BlockingQueue
https://blog.csdn.net/sjemYele/article/details/121004818

ArrayBlockingQueue
LinkedBlockingQueue

2.Map中线程安全的

concurrentHashMap
是一个支持高并发更新与查询的哈希表(基于HashMap)。
在保证安全的前提下,进行检索不需要锁定。
HashTable
原理是为每个方法添加了synchronized关键字,来实现的线程安全,锁住了整个对象(使用的锁是互斥锁)

集合的遍历、排序、查找等操作。

遍历

1.如何遍历集合框架中的元素?有哪些遍历方式?

1.使用迭代器(Iterator):通过调用集合的iterator()方法获取迭代器对象,然后使用while循环和next()方法逐个访问元素,直到遍历完所有元素。


List<String> list = new ArrayList<>();
// 添加元素到列表中
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    // 处理元素
}

2.使用增强型for循环(foreach):适用于数组和实现了Iterable接口的集合类,可以直接通过for循环遍历元素,不需要显式使用迭代器。


List<String> list = new ArrayList<>();
// 添加元素到列表中
for (String element : list) {
    // 处理元素
}

3.**使用Lambda表达式和Stream API:**从Java 8开始,引入了Lambda表达式和Stream API,可以通过Stream的forEach()方法对集合进行遍历,并结合Lambda表达式进行元素处理。

List<String> list = new ArrayList<>();
// 添加元素到列表中
list.stream().forEach(element -> {
    // 处理元素
});

4.使用普通的for循环:适用于数组和实现了RandomAccess接口的集合类,通过下标访问元素进行遍历。


List<String> list = new ArrayList<>();
// 添加元素到列表中
for (int i = 0; i < list.size(); i++) {
    String element = list.get(i);
    // 处理元素
}

排序、查找

集合类提供了丰富的排序、查找和其他操作方法,以下是一些常见的操作:

排序操作:

  • List:使用 Collections.sort(list) 方法对列表进行自然排序,或者使用实现了 Comparable 接口的自定义对象进行排序。也可以使用 Collections.sort(list, comparator) 方法根据自定义比较器进行排序。
  • TreeSet:元素会自动按照自然顺序或者自定义比较器的顺序进行排序。

查找操作:

  • List:可以使用 list.indexOf(element) 方法查找元素在列表中的索引,或者使用 list.contains(element) 方法判断元素是否存在。
  • Set:可以使用 set.contains(element) 方法判断元素是否存在。

其他操作:

  • 添加元素:使用 add(element) 方法将元素添加到集合中。
  • 删除元素:使用 remove(element) 方法从集合中删除指定元素。
  • 遍历元素:可以使用迭代器或增强型循环来遍历集合中的元素。
  • 获取集合大小:使用 size() 方法获取集合中元素的个数。

对于需要进行自定义排序或比较的场景,可以实现 Comparable 接口或创建自定义比较器(实现 Comparator 接口)来指定排序规则。

示例:

List<Integer> list = new ArrayList<>();
list.add(5);
list.add(3);
list.add(8);
Collections.sort(list); // 对列表进行自然排序
System.out.println(list); // 输出:[3, 5, 8]

List<String> strings = new ArrayList<>();
strings.add("banana");
strings.add("apple");
strings.add("cherry");
Collections.sort(strings, Collections.reverseOrder()); // 对列表进行逆序排序
System.out.println(strings); // 输出:[cherry, banana, apple]

Set<String> set = new TreeSet<>();
set.add("banana");
set.add("apple");
set.add("cherry");
System.out.println(set); // 输出:[apple, banana, cherry]
System.out.println(set.contains("apple")); // 输出:true
System.out.println(set.contains("orange")); // 输出:false

这些操作可以根据具体需求选择适合的集合类和方法,灵活地进行数据操作和处理。

ArrayList做初始化和扩容的时候是什么样的过程

当创建一个 ArrayList 实例时,会分配一定大小的内部数组作为存储容器。默认情况下,ArrayList 的初始容量为 10,但也可以通过指定初始容量的构造函数来自定义容量大小。当向 ArrayList 添加元素时,会首先检查当前元素个数是否已达到内部数组的容量上限。如果已达到容量上限,需要进行扩容操作。如果需要扩容时,ArrayList 会创建一个新的内部数组,并将原有的元素拷贝到新数组中,采用的容量增长方式为:新容器 = 原容量+原容量/2;在扩容过程中,ArrayList 会使用 System.arraycopy() 方法将原有数组中的元素复制到新的数组中。在扩容后,ArrayList 会更新内部的引用,指向新的内部数组。这样,之前的旧数组将被垃圾回收,释放内存空间。

Hashmap的get和put方法的实现?

HashMap 是基于哈希表实现的键值对存储结构,其中的 get() 和 put() 方法用于获取和插入键值对。下面是它们的简要实现过程:

  1. get() 方法的实现:

    • 首先,根据传入的键对象使用哈希函数计算出哈希值。
    • 哈希值用于确定键值对在内部数组中的索引位置。
    • 根据索引位置,在数组中找到对应的存储桶(bucket)。
    • 若存储桶为空,返回 null,表示没有找到对应的键值对。
    • 若存储桶不为空,则遍历存储桶中的链表或红黑树(Java 8+),查找与传入键对象相等的键值对。
    • 若找到匹配的键值对,则返回对应的值;否则返回 null。
  2. put() 方法的实现:

    • 首先,根据传入的键对象使用哈希函数计算出哈希值。
    • 哈希值用于确定键值对在内部数组中的索引位置。
    • 根据索引位置,在数组中找到对应的存储桶。
    • 若存储桶为空,直接将键值对插入存储桶中,并增加 HashMap 的大小计数器。
    • 若存储桶不为空,则遍历存储桶中的链表或红黑树,检查键对象是否已存在。
    • 若存在相同的键对象,则更新对应的值。
    • 若不存在相同的键对象,则将键值对添加到链表或红黑树中。
    • 如果链表或红黑树的长度超过了阈值(8),则将链表转换为红黑树,提高查找效率。
    • 若 HashMap 的大小达到了容量的阈值(负载因子 * 数组长度),则进行扩容操作,重新计算哈希值和存储位置。

需要注意的是,HashMap 采用数组+链表(或红黑树)的方式来解决哈希冲突,即不同的键对象可能会计算得到相同的哈希值。因此,在查找和插入过程中,需要遍历链表或红黑树来确保准确的键值对匹配。Java 8 引入了红黑树的优化,使得在一些场景下查找效率更高。

以上是对 HashMap 的 get() 和 put() 方法的简要实现过程的描述,实际的实现可能会有更多的细节和优化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《深入理解计算机系统(CSAPP)》第8章 异常控制流 - 学习笔记

写在前面的话&#xff1a;此系列文章为笔者学习CSAPP时的个人笔记&#xff0c;分享出来与大家学习交流&#xff0c;目录大体与《深入理解计算机系统》书本一致。因是初次预习时写的笔记&#xff0c;在复习回看时发现部分内容存在一些小问题&#xff0c;因时间紧张来不及再次整理…

Android 12系统源码_WindowInsets (一)WindowInsets相关类和功能介绍

一、什么是WindowInsets? WindowInsets源码解释为Window Content的一系列插值集合,可以理解为可以将其理解为不同的窗口装饰区域类型,比如一个Activity相对于手机屏幕需要空出的地方以腾给StatusBar、Ime、NavigationBar等系统窗口,具体表现为该区域需要的上下左右的宽高。…

如何强制删除文件夹?这样操作就能搞定!

案例&#xff1a;我想删掉一些没有用的文件夹&#xff0c;释放一些电脑内存&#xff0c;但是我发现&#xff0c;有些文件夹并不能直接被删除。怎样才能删除这些文件夹&#xff1f;有没有小伙伴有解决的办法。 在使用电脑过程中&#xff0c;我们可能会遇到一些无法正常删除文件夹…

操作系统-进程和线程-进程和线程

目录 一、进程的概念、组成、特征 二、进程的状态与转换、组织 2.1进程状态 2.2进程转换关系 2.3进程的组织 链接方式 索引方式 三、进程控制 3.1进程的创建 3.2进程的终止 3.3进程的阻塞和唤醒 3.4进程的切换 ​编辑 四、进程通信 4.1共享存储 4.2消息传递 直接通信…

[中间件漏洞]nginx漏洞复现

目录 文件解析漏洞 原理分析 复现过程 防御方法 目录遍历漏洞 原理分析 复现过程 防御方法 空字节代码执行漏洞 复现过程 防御方法 整数溢出漏洞&#xff08;CVE-2017-7529&#xff09; 复现过程 防御方法 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09; 复现过程 防…

南京市某高校计算机科学与技术专业性能测试与Loadrunner—考试试卷分析

XXX科技学院试卷 20 /20 学年 第 学期 课程所属部门&#xff1a; 课程名称&#xff1a; 课程编号&#xff1a; 考试方式&#xff1a;&#xff08;A、B、开、闭&#xff09;卷 使用班级&#xff1a; …

Android 12.0仿ios的hotseat效果修改hotseat样式

1.概述 最近在12.0产品项目需求的需要,系统原生Launcher的布局样式很一般,所以需要重新设计ui对布局样式做调整,产品在看到 ios的hotseat效果觉得特别美观,所以要仿ios一样不需要横屏铺满的效果 居中显示就行了,所以就要看hotseat的具体布局显示了 效果图如下: 2.仿io…

Python数据攻略-Pandas常用数据操作

大家好&#xff0c;我是Mr数据杨。今天我将带领各位走进Python的奇妙世界&#xff0c;就像步入三国演义那样热闹且复杂的战争年代。这里&#xff0c;数据就像那些智勇双全的武将和策士&#xff0c;我们要学习如何访问和修改它们&#xff0c;就如同诸葛亮那样掌控战局。 先来理…

springboot+vue医院网上预约挂号系统4n9w0

在线挂号平台已经成为它运营过程中至关重要的因素。医院挂号管理系统&#xff0c;是在计算机与通信设备十分完备的基础上&#xff0c;为医院管理人员、医生、用户提供的系统化的管理平台。 本系统需要实现基础的医院介绍、线上挂号、在线咨询、医生请假等几个主要功能。 管理员…

佛朗斯冲击港交所IPO:叉车租赁的未来是数字化?

佛朗斯“三战”IPO。 图源&#xff1a;佛朗斯 近日&#xff0c;广州佛朗斯股份有限公司&#xff08;下文简称为“佛朗斯”&#xff09;正式向港交所递交招股书&#xff0c;拟于港交所主板挂牌上市。 值得注意的是&#xff0c;这并不是佛朗斯首次冲击IPO。2019年6月和2020年7月…

Pytorch CIFAR10图像分类 ShuffleNet篇

Pytorch CIFAR10图像分类 ShuffleNet篇 文章目录 Pytorch CIFAR10图像分类 ShuffleNet篇4. 定义网络&#xff08;ShuffleNet&#xff09;Channel Shuffle网络单元 Shuffle UnitShuffleNet 网络结构summary查看网络测试和定义网络 5. 定义损失函数和优化器6. 训练及可视化&#…

【鲁棒、状态估计】用于电力系统动态状态估计的鲁棒迭代扩展卡尔曼滤波器研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

矿井水除氟——高矿化度矿井水氟化物深度降解的技术方案

高矿化度矿井水是指含有高浓度溶解性矿物质的废水&#xff0c;通常指的是含有高浓度钠、钙、镁、铁、铝、钾等离子的废水。这些离子通常来自于废水所处的环境、工业或生产过程中使用的原材料和化学品。高矿化度的废水通常具有高盐度、高电导率、高硬度等特征&#xff0c;对环境…

Measurement Studio 2019 f3 Crack

Measurement Studio是Microsoft Visual Studio的扩展软件&#xff0c;提供了用于创建测试和测量应用程序的.NET工具。 了解Measurement Studio的功能 Measurement Studio是​唯一​一​款.NET​工具​套​件&#xff0c;专为在Microsoft Visual Studio中构建工程应用&#xff0…

【redis基础】事务|管道|发布订阅

大家好~这里是redis系列文章之《【redis基础】事务|管道|发布订阅》上一篇文章&#xff1a;redis持久化【RDBAOF】持久化双雄_努力努力再努力mlx的博客-CSDN博客 目录 事务 概念 作用 数据库事务vs redis事务 常用指令 情况1&#xff1a;正常执行 情况2&#xff1a;放弃…

18- 弹幕系统设计

1、弹幕系统设计 场景分析&#xff1a;客户端针对某一视频创建了弹幕&#xff0c;发送后端进行处理&#xff0c;后端需要对所有正在观看该视频的用户推送该弹幕。 1.1、实现方式 使用短连接进行通信或使用长连接进行通信。 1.1.1、短连接实现方案 所有观看视频的客户端不断…

设计模式之~命令模式

定义&#xff1a; 命令模式&#xff08;Command&#xff09;&#xff0c;将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 为什么需要命令模式? 在我们的软件开发系统中…

长沙市直机关工委常务副书记梁敏一行莅临麒麟信安调研

5月25日&#xff0c;长沙市直机关工委专职副书记梁敏&#xff0c;市工信局党组成员、副局长、机关党委书记唐宁等一行莅临麒麟信安开展“党建引领数字经济发展工作”调研&#xff0c;麒麟信安党委书记王忠锋热情接待。 长沙市直机关工委专职副书记梁敏来到麒麟信安展厅&#…

SpringMVC第九阶段:Restful风格实现的CRUD

Restful风格实现的CRUD图书 把前面的传统请求方式的图书的CRUD换成刚刚讲的Restful风格的图书模块的CRUD。只需要修改页面端的请求方式和地址&#xff0c;以及服务器端Controller的接收。 1、列表功能实现 Controller中的修改: RequestMapping(value "/book",me…

数据表示(二进制、进制转换、补码计算)

目录 1.进制2.进制转换2.1 R进制转十进制2.2 十进制转R进制2.3 m进制转n进制方法1&#xff1a;十进制中转方法2&#xff1a;直接转化 3.进制计算3.1 机器数3.2 编码方式&#xff08;原码、反码、补码、移码&#xff09;3.3 表示范围定点整数定点小数 3.4 定点表示法 4.浮点数4.…