【炼气境】Java集合框架篇

news2024/11/17 10:55:48

【炼气境】Java集合框架篇


在这里插入图片描述

文章目录

  • 【炼气境】Java集合框架篇
    • 概述
    • 接口
      • Collection接口
        • List接口
          • ArrayList类
          • LinkedList类
        • Set接口
          • HashSet类
          • LinkedHashSet类
          • TreeSet类
        • Queue接口
          • LinkedList类
          • PriorityQueue类
          • ArrayDeque
      • Map接口
          • HashMap类
          • LinkedHashMap类
          • TreeMap类
    • 常用方法
    • 特性
    • 适用场景
    • 总结

概述

  • 集合框架是Java中用于存储和操作数据的一组接口和类的集合。

接口

Collection接口

List接口

ArrayList类

原理

  • 基于数组实现

特性

  • 动态扩容:ArrayList内部维护了一个数组,当元素个数超出数组容量时,会自动进行扩容操作,以保证能容纳更多的元素。

    快速访问:由于ArrayList是基于数组实现的,因此可以通过索引快速访问到任意位置的元素。

    元素有序:ArrayList中的元素按照插入的顺序排列,可以根据索引进行插入、删除和修改操作。

    • 子主题

常用方法

  • 添加元素:add(element)、add(index, element)
    获取元素:get(index)
    修改元素:set(index, element)
    删除元素:remove(index)、remove(element)
    获取大小:size()
    判断是否为空:isEmpty()
    判断是否包含某元素:contains(element)

注意

  • 频繁的插入、删除操作时性能较差,因为在插入和删除时需要移动其他元素。如果需要频繁的插入、删除操作,建议使用LinkedList类。
LinkedList类

原理

  • 基于双向链表实现

特性

  • 快速插入和删除:由于LinkedList基于链表实现,插入和删除操作只需要修改节点的引用,不需要移动其他元素,因此在频繁的插入和删除操作时性能较好。
    随机访问较慢:由于LinkedList没有像ArrayList那样基于数组实现,因此要访问特定位置的元素需要从链表的头部或尾部开始遍历,直到找到目标位置,因此随机访问的性能较差。
    支持队列和栈的操作:LinkedList实现了Deque接口,可以用作队列或栈来进行元素的添加和删除操作。

常用方法

  • 添加元素:add(element)、addFirst(element)、addLast(element)
    获取元素:get(index)、getFirst()、getLast()
    修改元素:set(index, element)
    删除元素:remove(index)、remove(element)、removeFirst()、removeLast()
    获取大小:size()
    判断是否为空:isEmpty()
    判断是否包含某元素:contains(element)

注意

  • 由于LinkedList是基于链表实现的,因此它在插入和删除操作上具有较好的性能,但在随机访问操作上较慢。

Set接口

HashSet类

原理

  • 基于哈希表实现

特性

  • 哈希表存储:HashSet内部使用哈希表来存储元素,每个元素被存储在哈希表的一个bucket中。
    元素唯一性:HashSet中的元素是不重复的,即不能包含重复元素。它是通过哈希表的键来实现元素的唯一性的。
    无序性:HashSet中的元素没有特定的顺序,即不保证元素的存储和插入顺序一致。

常用方法

  • 添加元素:add(element)
    删除元素:remove(element)
    判断是否包含某元素:contains(element)
    获取大小:size()
    判断是否为空:isEmpty()

注意

  • HashSet中的元素需要具有正确的hashCode()和equals()方法的实现,以便正确地判断元素的唯一性。当使用自定义对象作为HashSet中的元素时,需要重写这两个方法。

    HashSet的插入、删除和判断是否包含某元素的性能都是非常好的,但是它不保证元素的顺序,如果需要有序的存储和遍历操作,可以考虑使用LinkedHashSet。

LinkedHashSet类

原理

  • 基于哈希表和双向链表实现

特性

  • 哈希表存储:LinkedHashSet内部使用哈希表来存储元素,保证元素的唯一性和快速的插入、删除、查找操作。
    双向链表维护插入顺序:除了哈希表外,LinkedHashSet还使用一个双向链表来维护元素的插入顺序。因此,它可以保持元素的插入顺序,即按照元素插入的先后顺序进行遍历。

常用方法

  • 添加元素:add(element)
    删除元素:remove(element)
    判断是否包含某元素:contains(element)
    获取大小:size()
    判断是否为空:isEmpty()

注意

  • LinkedHashSet的性能与HashSet类似,其插入、删除和判断是否包含某元素的性能都是非常好的。额外的双向链表维护插入顺序并不会影响这些操作的性能。然而,与HashSet相比,LinkedHashSet在遍历操作上略慢一些,因为需要遍历链表来保持插入顺序。但是,LinkedHashSet仍然是一个非常有效的集合类,适用于需要保持插入顺序的场景。
TreeSet类

原理

  • 基于红黑树(一种自平衡的二叉搜索树)实现

特性

  • 有序存储:TreeSet中的元素是有序的,默认按照元素的自然顺序进行排序,或者可以通过传入Comparator来指定元素的排序方式。
    元素唯一性:TreeSet中的元素是不重复的,即不能包含重复元素。它是通过比较元素的顺序来实现元素的唯一性。
    操作效率:由于使用红黑树实现,TreeSet的插入、删除和查找操作的平均时间复杂度为O(log n),具有较高的操作效率。

常用方法

  • 添加元素:add(element)
    删除元素:remove(element)
    获取元素:first()、last()
    获取小于等于/大于等于某元素的最大/最小元素:floor(element)、ceiling(element)
    判断是否包含某元素:contains(element)
    获取大小:size()
    判断是否为空:isEmpty()

注意

  • 添加元素:add(element)
    删除元素:remove(element)
    获取元素:first()、last()
    获取小于等于/大于等于某元素的最大/最小元素:floor(element)、ceiling(element)
    判断是否包含某元素:contains(element)
    获取大小:size()
    判断是否为空:isEmpty()

Queue接口

LinkedList类
PriorityQueue类

原理

  • 基于堆实现的

特性

  • 堆数据结构:PriorityQueue内部使用堆来存储元素,通常使用二叉堆。二叉堆是一种完全二叉树,它的每个节点都满足父节点大于等于子节点(最大堆)或父节点小于等于子节点(最小堆)的条件。
    元素优先级排序:PriorityQueue中的元素按照优先级进行排序,具有最高优先级的元素在队首。元素的优先级可以通过实现Comparable接口或传入Comparator来指定。
    自动调整:当元素插入或删除时,PriorityQueue会自动调整堆结构,以保持堆的性质。

常用方法

  • 入队操作:add(element)、offer(element)
    出队操作:remove()、poll()
    获取队首元素:element()、peek()
    获取队列大小:size()
    判断队列是否为空:isEmpty()

注意

  • 需要注意的是,PriorityQueue中的元素需要具有可比较性,即实现了Comparable接口或通过传入Comparator来进行比较。当使用自定义对象作为PriorityQueue中的元素时,需要确保该对象实现了Comparable接口或提供了Comparator进行比较。

    PriorityQueue允许插入、删除和获取最高优先级元素的操作具有较高的效率,插入元素的时间复杂度为O(log n),删除和获取最高优先级元素的时间复杂度为O(1)。它适用于需要按照优先级排序的场景,比如任务调度、事件处理等。

ArrayDeque

原理

  • 基于动态数组实现的

特性

  • 动态数组:ArrayDeque内部使用动态数组(循环数组)来存储元素。循环数组是一种通过使用固定大小的数组,并通过头尾指针来循环利用数组空间的数据结构。
    双端队列:ArrayDeque既可以在队尾进行元素的入队操作,也可以在队首进行元素的出队操作,因此可以作为双端队列使用。
    自动扩缩容:当元素数量超过动态数组的容量时,ArrayDeque会自动扩容,当元素数量较少时,它会自动缩小容量,以提供更好的空间利用率。

常用方法

  • 入队操作:add(element)、offer(element)
    出队操作:remove()、poll()
    获取队首元素:element()、peek()
    入栈操作(在队首添加元素):push(element)
    出栈操作(移除并返回队首元素):pop()
    获取队列大小:size()
    判断队列是否为空:isEmpty()

注意

  • 需要注意的是,ArrayDeque并不是线程安全的,如果在多线程环境下使用,需要采取外部同步措施。

    与LinkedList相比,ArrayDeque在大多数操作上具有更高的效率。它的插入、删除和获取操作的时间复杂度都为O(1),并且由于使用动态数组实现,相对于LinkedList,ArrayDeque在内存上的利用率更高。因此,当需要高效地进行队列和栈操作或双端队列操作时,可以选择使用ArrayDeque。

Map接口

HashMap类

原理

  • 基于哈希表实现

特性

  • 哈希表:HashMap内部使用哈希表来存储键值对,哈希表是一种根据键的哈希值进行存储和查找的数据结构。通过计算键的哈希值,可以快速定位到对应的存储位置,以提供快速的数据访问。
    键的唯一性:HashMap中的键是唯一的,不可以重复。当插入具有相同键的键值对时,新的值会覆盖旧的值。
    键值对无序:HashMap中的键值对是无序的,即不保证存储和遍历的顺序与插入顺序一致。
    效率优化:HashMap在插入、获取和删除操作上都具有很高的效率,并且具有扩容机制,在容量不足时会自动扩容以提供更好的性能。

常用方法

  • 添加键值对:put(key, value)
    获取值:get(key)
    删除键值对:remove(key)
    判断包含键:containsKey(key)
    判断包含值:containsValue(value)
    获取键的集合:keySet()
    获取值的集合:values()
    获取键值对的集合:entrySet()
    获取大小:size()
    判断是否为空:isEmpty()

注意

  • HashMap适用于存储需要根据键快速查找值的场景,并且插入、获取和删除操作具有较高的效率。然而,由于哈希表的特性,HashMap的键值对是无序的,如果需要有序存储的特性,可以考虑使用LinkedHashMap。在多线程环境下使用HashMap时,需要采取外部同步措施,或者使用线程安全的ConcurrentHashMap类。
LinkedHashMap类

原理

  • 基于哈希表和双向链表实现

特性

  • 哈希表:LinkedHashMap内部使用哈希表来存储键值对,通过计算键的哈希值,可以快速定位到对应的存储位置,以提供快速访问。
    双向链表:LinkedHashMap内部使用双向链表来维护键值对的顺序,保持键值对的插入顺序或者最近访问顺序,从而实现有序存储。
    顺序模式:LinkedHashMap提供两种顺序模式,一种是按照插入顺序排序(插入顺序模式),另一种是按照最近访问顺序排序(访问顺序模式)。
    效率优化:LinkedHashMap在继承HashMap的基础上,通过维护双向链表来保持有序存储,因此在插入、获取和删除操作上与HashMap相比没有明显的性能损失。

常用方法

  • 添加键值对:put(key, value)
    获取值:get(key)
    删除键值对:remove(key)
    判断包含键:containsKey(key)
    判断包含值:containsValue(value)
    获取键的集合:keySet()
    获取值的集合:values()
    获取键值对的集合:entrySet()
    获取大小:size()
    判断是否为空:isEmpty()

注意

  • 通过设置LinkedHashMap的构造方法中的accessOrder参数为true可以启用访问顺序模式,即按照最近访问顺序排序。默认情况下,LinkedHashMap是按照插入顺序排序的。

    LinkedHashMap适用于需要保持有序存储的场景,可以根据插入顺序或者访问顺序进行排序和遍历。相比于HashMap,LinkedHashMap会稍微增加一些内存消耗和插入操作的开销,但通常对于大多数场景来说,这个开销是可以忽略的。

TreeMap类

原理

  • 基于红黑树实现

特性

  • 红黑树:TreeMap内部使用红黑树作为底层数据结构,红黑树是一种自平衡的二叉搜索树。通过保持树的平衡状态,可以提供高效的插入、删除和查找操作。
    键的有序性:红黑树的特性使得TreeMap中的键是有序的。根据键的比较结果,构建起一颗有序树,从而可以实现根据键的自然顺序或者自定义的比较器进行排序。
    效率优化:TreeMap在插入、获取和删除操作上具有较高的效率,红黑树的自平衡特性保证了树的高度维持在较低的水平上。

常用方法

  • 添加键值对:put(key, value)
    获取值:get(key)
    删除键值对:remove(key)
    获取键的集合:keySet()
    获取值的集合:values()
    获取键值对的集合:entrySet()
    获取最小键:firstKey()
    获取最大键:lastKey()
    获取小于等于给定键的最大键:floorKey(key)
    获取大于等于给定键的最小键:ceilingKey(key)
    获取大小:size()
    判断是否为空:isEmpty()

注意

  • 由于TreeMap是按照键的有序性来排列的,因此在使用TreeMap时,可以通过键的自然顺序或者自定义的比较器进行排序。TreeMap适用于需要以键的有序性进行操作的场景,可以方便地获取最小键、最大键、小于等于给定键的最大键、大于等于给定键的最小键等操作。但需要注意的是,由于维护红黑树的特性,相比于HashMap和LinkedHashMap,TreeMap在插入、删除等操作上会稍微慢一些。

常用方法

  • 添加元素
  • 删除元素
  • 查找元素
  • 遍历集合
  • 判断集合是否为空
  • 获取集合大小

特性

  • 可重复性
  • 有序性
  • 线程安全性

适用场景

  • 需要存储大量数据
  • 需要高效地增删改查数据
  • 需要保持数据的有序性
  • 需要去除重复数据

总结

  • 集合框架是Java中用于存储和操作数据的一组接口和类的集合,提供了各种实现类来满足不同的需求。它具有可重复性、有序性和线程安全性等特性,适用于存储大量数据、高效地增删改查数据、保持数据有序性和去除重复数据的场景。



                                                                                                             ---- 永不磨灭的番号:AK



在这里插入图片描述

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

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

相关文章

有点意思的 Java 递归调用

最近在刷一些问题的时候看到有下面一个问题 上面问的是当输入的字符串为什么的时候返回 True 总结 在做题目的时候,第一次还做错了。 这是因为解答这个题目的时间只有 3 分钟,没有自己看题目 后来拿着程序跑了下。 public void testGetPut() throws …

华为Mate60低调发布,你所不知道的高调真相?

华为Mate60 pro 这两天的劲爆新闻想必各位早已知晓,那就是华为Mate60真的来了!!!并且此款手机搭载了最新国产麒麟9000s芯片,该芯片重新定义了手机性能的巅峰。不仅在Geekbench测试中表现出色,还在实际应用…

星际争霸之小霸王之小蜜蜂(八)--蓝皮鼠和大脸猫

系列文章目录 星际争霸之小霸王之小蜜蜂(七)--消失的子弹 星际争霸之小霸王之小蜜蜂(六)--让子弹飞 星际争霸之小霸王之小蜜蜂(五)--为小蜜蜂降速 星际争霸之小霸王之小蜜蜂(四)--事…

C++智能指针介绍与使用

什么是智能指针 智能指针是一种 C 标准库中的模板类,用于管理动态分配内存资源。它们提供了自动化的内存管理功能,可以帮助程序员在避免内存泄漏和野指针的同时,简化内存资源的手动释放。C 标准库中提供了三种主要的智能指针:std…

学习记录——Efficient MOdel轻量化主干模型(iRMB、EMO)、CATnet

Rethinking Mobile Block for Efficient Attention-based Models 结合 CNN 和 Transformer 的倒残差移动模块设计 ICCV-2023 实例化了一个面向移动端应用的iRMB基础模块(Inverted Residual Mobile Block,倒残差移动模块),其同时具…

springboot如何区分测试环境、生产环境。分环境启动

一 通过Maven打包时&#xff0c;将不同环境文件打入jar包来区分环境&#xff0c;然后直接启动jar包即可 1 pom.xml文件project标签里面加入以下配置 环境关键字可以根据自己的习惯来改 <profiles><!--开发--><profile><id>dev</id><propert…

前端文件相关总结

先引用掘金上的一个总结&#xff0c;将前端会遇到的文件相关的知识点间的关系串联了起来。 前端技术提供了一些高效的解决方案&#xff1a;文件流操作和切片下载与上传。 1. 文件基本操作 1.1 数据流和文件处理的基本概念 数据流是指连续的数据序列&#xff0c;可以从一个源传输…

并发编程的故事——共享模式之无锁

共享模式之无锁 文章目录 共享模式之无锁一、提出问题二、CAS和volatile三、原子整数四、原子引用五、原子数组六、原子更新器七、原子累加器八、unsafe 一、提出问题 关于对共享变量修改的多线程问题其实就是指令交错问题导致取值的时机相同&#xff0c;最后修改之后以最后一…

【基于空间纹理的残差网络无监督Pansharpening】

Unsupervised Pansharpening method Using Residual Network with Spatial Texture Attention &#xff08;基于空间纹理的残差网络无监督泛锐化方法&#xff09; 近年来&#xff0c;深度学习已经成为最受欢迎的泛锐化工具之一&#xff0c;许多相关方法已经被研究并反映出良好…

Qt xml解析之QXmlStreamReader

文章目录 背景QXmlStreamReader简单介绍使用QXmlStreamReader添加头文件<QXmlStreamReader>toString()toInt()完整代码 背景 项目中遇到需要解析某个方法返回的xml字符串&#xff0c;奈何C/C中没有原生的方法可供调用&#xff0c;只能使用第三方库&#xff0c;搜了一圈资…

OpenCV之filter2D函数

函数原型&#xff1a; CV_EXPORTS_W void filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kernel,Point anchorPoint(-1,-1),double delta0,int borderTypeBORDER_DEFAULT); src: 原图像&#xff1b; dst&#xff1a;输出图像 &#xff0c;和输入的图像具有…

优秀的ui设计作品(合集)

UI设计师需要了解的九个Tips 1.图片类APP排版突破 规则是死的&#xff0c;人是活的。很多时候&#xff0c;如果需求是比较宽要尝试突破原则&#xff0c;用一些另类的排版方式&#xff0c;其实也是做好设计的本质。在图片类app中&#xff0c;错落一些的排版会使你的作品更有魅力…

Ubuntu系统安装VirtualBox后无发安装“增强功能”的解决办法

Ubuntu系统安装VirtualBox后&#xff0c; 在设备选项中点击曾倩功能没有反应&#xff0c;也不能是用多动和剪切板功能&#xff0c;解决办法如下 1. 安装linux-image Terminal执行: sudo apt-get install --reinstall linux-image-$(uname -r) 2. 安装virtualbox-guest-x11 …

9.Redis-zset

zset zset 有序集合 -> 升序常用命令zaddzcardzcountzrangezrevrange -> reverse 逆序zrangebyscorezpopmaxzpopminbzpopmax / bzpopminzrankzrevrankzscorezremzremrangebyrankzremrangebyscorezincrby集合间操作zinter -> 交集zunion -> 并集zdiff -> 差集zin…

0202hdfs的shell操作-hadoop-大数据学习

文章目录 1 进程启停管理2 文件系统操作命令2.1 HDFS文件系统基本信息2.2 介绍2.3 创建文件夹2.4 查看指定文件夹下的内容2.5 上传文件到HDFS2.6 查看HDFS文件内容2.7 下载HDFS文件2.8 HDFS数据删除操作 3 HDFS客户端-jetbrians产品插件3.1 Big Data Tools 安装3.2 配置windows…

睿趣科技:开抖音小店挣钱吗到底

在当今数字化时代&#xff0c;社交媒体平台成为了创业者们寻找商机和赚钱的新途径。而抖音作为一款风靡全球的短视频分享平台&#xff0c;自然也成为了许多人开设小店、进行创业的选择之一。那么&#xff0c;开抖音小店能否真正实现盈利&#xff0c;成为了一个备受关注的话题。…

并发编程的故事——共享模型之内存

共享模型之内存 文章目录 共享模型之内存一、JVM内存抽象模型二、可见性三、指令重排序 一、JVM内存抽象模型 主要就是把cpu下面的缓存、内存、磁盘等抽象成主存和工作内存 体现在 可见性 原子性 有序性 二、可见性 出现的问题 t线程如果频繁读取一个静态变量&#xff0c;那…

Android安卓实战项目(12)—关于身体分析,BMI计算,喝水提醒,食物卡路里计算APP【支持中英文切换】生活助手类APP(源码在文末)

Android安卓实战项目&#xff08;12&#xff09;—关于身体分析&#xff0c;BMI计算&#xff0c;喝水提醒&#xff0c;食物卡路里计算APP【支持中英文切换】生活助手类APP&#xff08;源码在文末&#x1f415;&#x1f415;&#x1f415;&#xff09; 一.项目运行介绍 B站演示…

第8章 字符输入/输出和输入验证

本章介绍以下内容&#xff1a; 更详细地介绍输入、输出以及缓冲输入和无缓冲输入的区别 如何通过键盘模拟文件结尾条件 如何使用重定向把程序和文件相连接 创建更友好的用户界面 在涉及计算机的话题时&#xff0c;我们经常会提到输入&#xff08;input&#xff09;和输出&#…

Facebook登录SDK

一、Facebook SDK接入 官方文档&#xff1a;https://developers.facebook.com/docs/facebook-login/android 按照流程填写完成 1、选择新建应用 如果已经创建了应用就点【搜索你的应用】&#xff0c;忽略2、3步骤 2、选择【允许用户用自己的Facebook账户登录】 3、填写应用…