Java 常用的一些Collection的实现类

news2024/9/28 14:25:51

Java 常用的一些Collection的实现类

在这里插入图片描述

Collection

在这里插入图片描述

1.集合基础

Java 集合框架是一个强大的工具,它提供了一套标准化的接口和类,用于存储和操作集合数据。Collection 接口是这个框架的核心,它定义了一系列通用的集合操作。

2.Collection接口方法

  • List list = new ArrayList();

    • 创建一个新的空列表,ArrayList 是实现 List 接口的一个常用类,它允许快速随机访问。
  • list.add(Object o)

    • 向列表中添加一个元素。如果元素已存在,则不添加。
  • list.addAll(Collection c)

    • 将指定集合中的所有元素添加到列表中。
  • list.remove(Object o)

    • 删除列表中首次出现的指定元素。如果没有这样的元素,则不执行任何操作。
  • list.removeAll(Collection c)

    • 删除列表中与指定集合共有的所有元素。
  • list.contains(Object o)

    • 判断列表中是否包含指定元素。
  • list.containsAll(Collection c)

    • 判断列表中是否包含指定集合中的所有元素。
  • list.size()

    • 返回列表中的元素数量。
  • list.isEmpty()

    • 判断列表是否为空。
  • list.clear()

    • 清空列表中的所有元素。

3.Iterator

Iterator 接口用于遍历集合中的元素。

  • Iterator iterator = list.iterator();

    • 创建一个迭代器实例,用于遍历指定的集合。
  • while(iterator.hasNext()) { ... }

    • 检查迭代器是否有下一个元素。
  • Object o = iterator.next();

    • 返回迭代器的下一个元素。

Collection的实现类

1.List

List 接口继承自 Collection,它不仅保证了元素的唯一性,还保证了元素的顺序。

1.1 list接口方法
  • list.get(int index)

    • 返回列表中指定索引处的元素。
  • list.add(int index, Object o)

    • 在列表的指定位置插入元素。
  • list.addAll(int index, Collection c)

    • 从指定位置开始,将指定集合中的所有元素添加到列表中。
  • list.indexOf(Object o)

    • 返回指定元素第一次出现的索引,如果不存在,返回 -1。
  • list.lastIndexOf(Object o)

    • 返回指定元素最后一次出现的索引,如果不存在,返回 -1。
  • list.remove(int index)

    • 删除列表中指定索引处的元素。
  • list.set(int index, Object o)

    • 用指定元素替换列表中指定索引处的元素。
  • list.subList(int fromIndex, int toIndex)

    • 返回列表中从 fromIndex(包含)到 toIndex(不包含)的子列表。
1.2 ArrayList

在这里插入图片描述

ArrayList 是一个动态数组实现,它允许在数组中进行快速随机访问。

扩容

ArrayList 需要更多空间时,它会进行扩容。如果不指定初始容量,默认初始容量为 10,每次扩容时大小会增加大约 50%。

1.3 LinkedList

LinkedList 是 Java 集合框架中 List 接口的一个实现类,它是一个双向链表。与基于数组的集合(如 ArrayList)相比,LinkedList 提供了在列表中的任意位置高效插入和删除元素的能力。

特性
  • 双向链表:每个元素(称为节点)都包含指向其前一个元素和后一个元素的引用。
  • 动态大小LinkedList 可以动态地添加和删除元素,不需要预先定义大小。
  • 非同步LinkedList 不是线程安全的,如果你在多线程环境中使用,可能需要外部的同步机制。
  • 内存使用:由于每个节点包含额外的指针,LinkedList 相对于 ArrayList 可能会使用更多的内存。
方法
  • LinkedList()

    • 创建一个空的 LinkedList
  • LinkedList(Collection<? extends E> c)

    • 创建一个新的 LinkedList,包含指定集合中的所有元素。
  • add(E e)

    • 在列表的末尾添加一个元素。
  • add(int index, E element)

    • 在列表的指定位置插入元素。
  • addFirst(E e)

    • 在列表的开头添加一个元素。
  • addLast(E e)

    • 在列表的末尾添加一个元素,这是 add 方法的别名。
  • get(int index)

    • 返回列表中指定位置的元素。
  • set(int index, E element)

    • 用指定元素替换列表中指定位置的元素。
  • remove(Object o)

    • 移除列表中首次出现的指定元素。
  • remove(int index)

    • 移除列表中指定位置的元素。
  • removeFirst()

    • 移除并返回列表中的第一个元素。
  • removeLast()

    • 移除并返回列表中的最后一个元素。
  • poll()

    • 移除并返回列表中的第一个元素,如果没有元素,则返回 null
  • pollFirst()

    • 移除并返回列表中的第一个元素,如果没有元素,则返回 null,这是 poll 方法的别名。
  • pollLast()

    • 移除并返回列表中的最后一个元素,如果没有元素,则返回 null
  • peek()

    • 返回列表中的第一个元素,如果没有元素,则返回 null
  • peekFirst()

    • 返回列表中的第一个元素,如果没有元素,则返回 null,这是 peek 方法的别名。
  • peekLast()

    • 返回列表中的最后一个元素,如果没有元素,则返回 null
  • size()

    • 返回列表中的元素数量。
  • isEmpty()

    • 判断列表是否为空。
  • clear()

    • 清空列表中的所有元素。
  • indexOf(Object o)

    • 返回列表中首次出现的指定元素的索引,如果不存在,返回 -1。
  • lastIndexOf(Object o)

    • 返回列表中最后出现的指定元素的索引,如果不存在,返回 -1。
  • subList(int fromIndex, int toIndex)

    • 返回列表中从 fromIndex(包含)到 toIndex(不包含)的子列表。

2. Map

Map 接口表示键值对的集合,它不保证元素的顺序。

2.1TreeMap

TreeMap 是一个基于红黑树实现的 NavigableMap,它按照键的自然顺序或者提供的比较器进行排序。

TreeMap 特性
  • 自动排序
  • 提供了访问最大键、最小键以及获取键值对的方法。
  • floorEntry(int key)
// 返回一个 `Map.Entry` 对象,它映射到小于或等于指定键的最大键值对。
Map.Entry<Integer, Integer> integerEntry = treeMap.floorEntry(key);

3.Queue

Queue 接口表示一个先进先出(FIFO)的集合。

3.1PriorityQueue

PriorityQueue 是一个基于优先级堆的无界队列,元素根据自然顺序或提供的比较器排序。- - -

  • PriorityQueue 使用
#创建一个优先队列,其中元素按照降序排序。
PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> b - a); 

4.Deque的实现类ArrayDeque

ArrayDeque 是 Java 集合框架中 Deque(双端队列)接口的一个实现类。它是一个可调整大小的数组实现的队列,提供了在两端快速插入和删除元素的能力。

特性
  • 双端队列:支持在队列的两端进行插入(offer、add)和删除(poll、remove)操作。
  • 可调整大小:内部数组大小会根据需要动态调整,以容纳更多的元素。
  • 非同步ArrayDeque 不是线程安全的,如果你在多线程环境中使用,可能需要外部的同步机制。
  • 迭代器:提供迭代器支持,允许遍历双端队列中的元素。
方法
  • ArrayDeque()

    • 创建一个空的双端队列。
  • ArrayDeque(int initialCapacity)

    • 创建一个具有指定初始容量的空双端队列。
  • offerFirst(E e)

    • 在队列的开头插入元素。
  • offerLast(E e)

    • 在队列的末尾插入元素。
  • addFirst(E e)

    • 在队列的开头插入元素,如果队列已满,则抛出 IllegalStateException
  • addLast(E e)

    • 在队列的末尾插入元素,如果队列已满,则抛出 IllegalStateException
  • removeFirst()

    • 移除并返回队列开头的元素。
  • removeLast()

    • 移除并返回队列末尾的元素。
  • pollFirst()

    • 移除并返回队列开头的元素,如果没有元素,则返回 null
  • pollLast()

    • 移除并返回队列末尾的元素,如果没有元素,则返回 null
  • getFirst()

    • 返回队列开头的元素,如果没有元素,则抛出 NoSuchElementException
  • getLast()

    • 返回队列末尾的元素,如果没有元素,则抛出 NoSuchElementException
  • peekFirst()

    • 返回队列开头的元素,如果没有元素,则返回 null
  • peekLast()

    • 返回队列末尾的元素,如果没有元素,则返回 null
  • size()

    • 返回队列中的元素数量。
  • isEmpty()

    • 判断队列是否为空。
  • clear()

    • 清空队列中的所有元素。

对比使用

1. ArrayDeque 与 LinkedList 的优劣?

ArrayDeque 和 LinkedList 都实现了 Queue 和 Deque 接口

1.1 ArrayDeque(数组双端队列):

1.内部使用数组来存储元素,因此支持随机访问和快速索引。
2.在队尾进行插入和删除操作的性能很好,时间复杂度为 O(1)。
3.在队头进行插入和删除操作需要移动元素,因此时间复杂度O(n).
4.不支持 null 元素。

1.2 LinkedList(链表):

1.内部使用双向链表来存储元素,因此插入和删除操作的性能比ArrayDeque 更好。
2.在队头和队尾进行插入和删除操作的时间复杂度都是 O(1)。
3.支持 null 元素。
4.不支持随机访问,访问元素需要按照链表顺序遍历,因此时间复杂度为 O(n)。

优劣势比较:

如果需要频繁在队头和队尾进行插入和删除操作,并且不需要随机访问元素,选择 LinkedList 更合适,因为它的插入和删除性能更好。

如果需要频繁进行随机访问或者在队尾进行插入和删除操作,并且不会频繁在队头进行插入和删除操作,选择 ArrayDeque 更合适,因为它在这些方面的性能更好。

2. 那Stack呢?

优势:
1.简单易用:Stack 提供了 push、pop、peek 等方法,使得在栈的操作上非常直观和简单。
2.符合栈的特性:栈的特性是后进先出(LIFO),Stack 类的操作方法符合这一特性,可以方便地实现栈的 功能。

限制和注意事项:

继承自 Vector: Stack 是 Vector 的子类,因此它基于数组实现,会受到数组扩容和拷贝的性能影响。
线程安全性: Stack 是线程安全的,但由于继承自 Vector,其性能相对较低。在多线程环境下,推荐使 用并发包中的类,如 ConcurrentLinkedDeque。

使用技巧

如果需要使用栈这种数据结构,并且操作相对简单,不需要高性能和大规模并发,Stack 是一个合适的选择。但是在需要高性能或者多线程环境下,可以考虑使用其他更适合的数据结构,比如 ArrayDeque 或 ConcurrentLinkedDeque。

3. ConcurrentLinkedDeque

ConcurrentLinkedDeque 是 Java 中的一个并发安全的双端队列实现,它提供了高效的并发操作支持,并且不需要使用显式的同步措施(如锁),因此适合在多线程环境下使用。

特点和优势:

1.并发安全性: ConcurrentLinkedDeque 是线程安全的数据结构,可以在多线程环境下安全地进行操作,无 需额外的同步措施。
2.非阻塞操作: 内部实现采用了无锁算法(lock-free),因此不会发生线程阻塞,提高了并发性能。
3.双端队列: 支持在队头和队尾进行插入、删除等操作,具有良好的灵活性。
4.高效性能: 在多线程环境下,ConcurrentLinkedDeque 提供了较高的性能,适用于高并发的场景。
5.无边界: ConcurrentLinkedDeque 没有固定的容量限制,可以根据需要动态调整大小。

如果需要在多线程环境下使用双端队列,并且对性能有较高要求,那么 ConcurrentLinkedDeque 是一个很好的选择。它避免了传统同步机制(如锁)带来的性能开销和线程阻塞问题,提供了高效的并发操作支持。

4. 示例

import java.util.concurrent.ConcurrentLinkedDeque;

//创建 ConcurrentLinkedDeque 实例:
ConcurrentLinkedDeque<String> deque = new ConcurrentLinkedDeque<>();

//添加元素:
deque.add("First");
deque.add("Second");
deque.offer("Third"); // 在队尾添加元素


//移除元素:
String firstElement = deque.poll(); // 移除并返回队头元素
String lastElement = deque.pollLast(); // 移除并返回队尾元素


//获取元素:
String peekFirstElement = deque.peek(); // 获取但不移除队头元素
String peekLastElement = deque.peekLast(); // 获取但不移除队尾元素


//遍历元素:
for (String element : deque) {
    System.out.println(element);
}


//其他操作:
int size = deque.size(); // 获取队列大小
boolean isEmpty = deque.isEmpty(); 

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

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

相关文章

既然有HTTP协议,为什么还要有RPC?

既然有HTTP协议&#xff0c;为什么还要有RPC&#xff1f; ​ 既然有HTTP协议&#xff0c;为什么还要有RPC&#xff1f; 有点既生瑜何生亮的味道。 第一次接触RPC我就很懵&#xff0c;平时我HTTP协议用得好好的&#xff0c;为什么还需要RPC协议&#xff1f; 于是我去百度&am…

最详细!适合AI大模型零基础入门的学习路线+学习方法+学习资料,全篇干货,建议收藏!

前言 随着ChatGPT的横空出世&#xff0c;大模型时代正式来临。千亿甚至万亿参数的大模型陆续出现&#xff0c;各大企业、高校纷纷推出自己的大模型&#xff0c;这标志着通用智能时代的到来。对于零基础的初学者来说&#xff0c;如何快速入门AI大模型&#xff0c;抓住这个时代的…

通过管道和共享存储映射实现进程通信

1.IPC方法 Linux环境下&#xff0c;进程地址空间相互独立&#xff0c;每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到&#xff0c;所以进程和进程之间不能相互访问&#xff0c;要交换数据必须通过内核&#xff0c;在内核中开辟一块缓冲区&a…

物联网智能项目全面解析

目录 引言 一、物联网概述 1.1 什么是物联网 1.2 物联网的历史与发展 二、物联网智能项目分类 三、关键组件与技术 3.1 传感器和执行器 3.2 连接技术 3.3 数据处理与分析 3.4 用户界面 四、物联网智能项目案例分析 4.1 智能家居 4.2 智慧城市 4.3 工业物联网 4.4…

孩子英语不好,能学编程吗?

随着编程教育的普及&#xff0c;越来越多的家长开始关注孩子的编程学习。然而&#xff0c;不少家长提出了这样的疑问&#xff1a;“孩子的英语不好&#xff0c;是否还能学编程&#xff1f;”毕竟&#xff0c;编程语言是基于英语的&#xff0c;代码中也充斥着大量的英语单词和短…

数据结构-3.6.队列的链式实现

队列可以理解为单链表的阉割版&#xff0c;相比单链表而言&#xff0c;队列只有在添加和删除元素上和单链表有区别 一.队列的链式实现&#xff1a; 1.图解&#xff1a; 2.代码&#xff1a; #include<stdio.h> ​ typedef struct LinkNode //链式队列结点 {int data;st…

【韩顺平Java笔记】第1章

0-1可以看视频&#xff0c;下面记录主要内容 2. 就业方向 Java基础又叫JavaSE&#xff0c;Java有三个主要的就业方向&#xff1a; JavaEE软件工程师&#xff1a;电商&#xff0c;团购&#xff0c;众筹&#xff0c;sns&#xff08;社交网络&#xff09;&#xff0c;教育&…

纠删码参数自适应匹配问题ECP-AMP实验方案(一)

摘要 关键词&#xff1a;动态参数&#xff1b;多属性决策&#xff1b;critic权重法&#xff1b;DBSCA聚类分析 引言 云服务存储系统是一种基于互联网的数据存储服务&#xff0c;它可以为用户提供大规模、低成本、高可靠的数据存储空间。云服务存储系统的核心技术之一是数据容…

winsoft公司Utils组件功能简介

Winsoft Utils Library 2.3 是一个为 Delphi 和 C Builder&#xff08;版本 7 到 12 Athens&#xff09;设计的实用工具库。它提供了一系列组件和类&#xff0c;旨在简化和增强开发过程。以下是一些主要功能和特点&#xff1a; 1.组件集合&#xff1a;包含多种实用组件&#x…

AB plc设备数据 转profinet IO项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集AB PLC数据 2 5 用PROFINET IO协议转发数据 4 6 案例总结 7 1 案例说明 设置网关采集AB PLC数据把采集的数据转成profinet IO协议转发给其他系统。 2 VFBOX网关工作原理 VFBOX网关是协议转换网关&#xff0…

如果再回到从前——备忘录模式

文章目录 如果再回到从前——备忘录模式如果再给我一次机会……游戏存进度备忘录模式备忘录模式基本代码游戏进度备忘 如果再回到从前——备忘录模式 如果再给我一次机会…… 时间&#xff1a;5月6日18点  地点&#xff1a;小菜、大鸟住所的客厅  人物&#xff1a;小菜、…

Sharding-JDBC笔记03-分库分表代码示例

文章目录 一、水平分库1. 将原有order_db库拆分为order_db_1、order_db_22. 分片规则修改分片策略standardcomplexinlinehintnone 3. 插入测试4. 查询测试5. 使用分库分片键查询测试总结 二、公共表1. 创建数据库2. 在Sharding-JDBC规则中修改3. 数据操作4. 字典操作测试5. 字典…

Linux线程-POSIX信号量与锁以及条件变量

POSIX信号量 POSIX没有元素这个概念相比于SYSTEM-V更简洁&#xff0c;POSIX不一定适用老版本&#xff1b;二者都是系统范畴&#xff0c;都需要手动删除&#xff0c;POSIX相关函数属于线程库&#xff0c;所有编译时需要末尾加上-lpthread选项 POSIX POSIX有名信号量 主要用于进…

华为 HCIP-Datacom H12-821 题库 (29)

&#x1f423;博客最下方微信公众号回复题库,领取题库和教学资源 &#x1f424;诚挚欢迎IT交流有兴趣的公众号回复交流群 &#x1f998;公众号会持续更新网络小知识&#x1f63c; 1.BFD 为确保两端系统都知道状态的变化&#xff0c;在BFD 状态机的建立和拆除时都采用三次握手…

【LeetCode:75. 颜色分类 + 快速排序】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

图像超分辨率(SR)

图像超分辨率&#xff08;Image Super-Resolution, SR&#xff09;是一种图像处理技术&#xff0c;旨在从低分辨率&#xff08;LR&#xff09;图像中恢复出高分辨率&#xff08;HR&#xff09;图像。这种技术通过增加图像中的细节和清晰度来提高图像的视觉质量&#xff0c;从而…

微信支付准备工作之内网穿透2024/9/28

微信支付部分好像做不了&#xff0c;但是跟着写了点东西。 做项目的微信支付功能时&#xff0c;微信后台需要调用到商户管理系统&#xff0c;但是我们的管理系统写在自己的电脑里。微信后台如何调用到商户系统&#xff1f;内网穿透。 还有如何保证调用过程数据安全&#xff1…

PowerDesigner 16.5安装教程 + 轻松解决软件证书过期导致的无法使用问题

目录 背景: 安装教程 &#xff1a; 证书过期的解决方法&#xff1a; 背景: PowerDesigner16.5凭借强大的功能集成、广泛的兼容性和高效的模型驱动开发方法成为了企业级建模于设计领域的佼佼者。无论是在企业信息化建设、软件开发项目还是数据库设计于管理等领域它都能提有利…

【步联科技身份证】 身份证读取与解析———未来之窗行业应用跨平台架构

一、身份证解析代码 C# function 身份证数据解析_湖南步联科技(wzxx) {var result {};result[xm] wzxx.substr(0, 15);result[xbdm] wzxx.substr(15, 1);result[mzdm] wzxx.substr(16, 2);result[csrq] wzxx.substr(18, 8);result[dzmc] wzxx.substr(26, 35);result[gms…

论文阅读 | HiDDeN网络架构

ECCV 2018 斯坦福-李飞飞团队 一、问题描述 受以下启发&#xff1a; 对抗性例子的发现&#xff1a;深度学习模型在图像识别任务中对微小的、难以察觉的输入扰动非常敏感&#xff0c;这些扰动可以导致模型错误分类图像。这一现象表明&#xff0c;神经网络可以在图像中编码信息&…