java中集合List,Set,Queue,Map

news2024/10/5 15:32:41

Java SE中的集合框架是一组用于存储和操作对象的类和接口。它提供了丰富的数据结构,可以用于解决各种问题。Java SE中的集合框架包含以下主要类和接口:
在这里插入图片描述

一. Collection接口:

是集合框架的根接口,它定义了一些通用的集合操作方法,比如添加、删除、查找、遍历等。
作为集合框架的根接口,Collection接口定义了一些通用的集合操作方法,下面举例说明这些方法的用法:

1.添加元素:使用add()方法将指定的元素添加到集合中。

Collection<String> collection = new ArrayList<>();
collection.add("apple");
collection.add("banana");
  1. 删除元素:使用remove()方法从集合中删除指定的元素。
collection.remove("apple");
  1. 查找元素:使用contains()方法判断集合中是否包含指定的元素。
boolean containsApple = collection.contains("apple");
  1. 遍历集合:使用迭代器(iterator()方法)或者增强for循环(foreach)来遍历集合中的元素。
Iterator<String> iterator = collection.iterator();
while(iterator.hasNext()){
    String element = iterator.next();
    System.out.println(element);
}

for(String element : collection){
    System.out.println(element);
}
  1. 获取集合大小:使用size()方法获取集合中的元素个数。
int size = collection.size();
  1. 判断集合是否为空:使用isEmpty()方法判断集合是否为空。
boolean isEmpty = collection.isEmpty();
  1. 清空集合:使用clear()方法清空集合中的所有元素。
collection.clear();

需要注意的是,Collection接口中的方法都是抽象方法,具体的实现在其子类中完成。

二. List接口:

List接口是Collection接口的子接口,表示一个有序集合,可以包含重复元素。List接口的常见实现类有:

ArrayList:基于动态数组实现,支持随机访问,插入和删除元素的效率较低。
LinkedList:基于双向链表实现,支持快速插入和删除元素,但访问元素的效率较低。
Vector:基于动态数组实现,与ArrayList类似,但线程安全,不推荐使用。
Stack:基于Vector实现,表示一个后进先出(LIFO)的堆栈结构。
CopyOnWriteArrayList:基于数组实现,可以在迭代的同时进行插入和删除操作,适用于读多写少的场景。
除了这些常见的实现类之外,还可以通过继承AbstractList类或实现List接口来创建自定义的List实现类。下面举例说明List接口的用法:

  1. 创建List集合并添加元素:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("apple"); //可以添加重复元素
  1. 获取元素:
String firstElement = list.get(0); //获取索引为0的元素
  1. 修改元素:
list.set(0, "orange"); //将索引为0的元素修改为"orange"
  1. 删除元素:
list.remove("apple"); //删除指定元素
list.remove(0); //删除索引为0的元素
  1. 查找元素:
boolean containsApple = list.contains("apple"); //判断集合中是否包含"apple"
int index = list.indexOf("banana"); //查找元素"banana"的索引
  1. 获取集合大小:
int size = list.size(); //获取集合的大小
  1. 遍历集合:
for(String element : list){
    System.out.println(element);
}

Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
    String element = iterator.next();
    System.out.println(element);
}

需要注意的是,List接口是有序的,可以通过索引访问元素。同时,List接口中也继承了Collection接口中的方法,可以使用Collection接口中的通用方法对List进行操作。

三. Set接口:

Set接口是Collection接口的子接口,表示一个无序、不重复的集合。Set接口的常见实现类有:

  1. HashSet:基于哈希表实现,不保证元素的顺序,可以存储null元素。
  2. TreeSet:基于红黑树实现,保证元素的有序性,不允许存储null元素。
  3. LinkedHashSet:基于哈希表和链表实现,保证元素的插入顺序,允许存储null元素。
  4. EnumSet:专门用于存储枚举类型的集合。
  5. CopyOnWriteArraySet:基于数组实现,可以在迭代的同时进行插入和删除操作,适用于读多写少的场景。

除了这些常见的实现类之外,还可以通过继承AbstractSet类或实现Set接口来创建自定义的Set实现类。下面举例说明Set接口的用法:

  1. 创建Set集合并添加元素:
Set<String> set = new HashSet<>();
set.add("apple");
set.add("banana");
set.add("apple"); //不会添加重复元素
  1. 查找元素:
boolean containsApple = set.contains("apple"); //判断集合中是否包含"apple"
  1. 删除元素:
set.remove("apple"); //删除指定元素
  1. 获取集合大小:
int size = set.size(); //获取集合的大小
  1. 遍历集合:
for(String element : set){
    System.out.println(element);
}

Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
    String element = iterator.next();
    System.out.println(element);
}

需要注意的是,Set接口是无序的,不保证元素的存储顺序。同时,Set接口中也继承了Collection接口中的方法,可以使用Collection接口中的通用方法对Set进行操作。另外,TreeSet是Set接口的有序实现类,它会按照元素的自然顺序进行排序。

四. Map接口:

Map接口是用于存储键值对的集合,它是集合框架中的一部分。Map接口的常见实现类有:

  1. HashMap:基于哈希表实现,不保证键值对的顺序,可以存储null键和null值。
  2. TreeMap:基于红黑树实现,保证键值对的有序性,不允许存储null键,但可以存储null值。
  3. LinkedHashMap:基于哈希表和链表实现,保证键值对的插入顺序,允许存储null键和null值。
  4. Hashtable:基于哈希表实现,保证键值对的同步访问,不保证键值对的顺序,不允许存储null键和null值。
  5. ConcurrentHashMap:基于哈希表和分段锁实现,并发安全的Map,允许并发地进行读写操作。
  6. EnumMap:专门用于存储枚举类型作为键的集合。

除了这些常见的实现类之外,还可以通过继承AbstractMap类或实现Map接口来创建自定义的Map实现类。下面举例说明Map接口的用法:

  1. 创建Map并添加键值对:
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);
map.put("orange", 3);
  1. 获取键对应的值:
int appleValue = map.get("apple"); //获取键"apple"对应的值
  1. 判断是否包含键:
boolean containsKey = map.containsKey("apple"); //判断是否包含键"apple"
  1. 判断是否包含值:
boolean containsValue = map.containsValue(1); //判断是否包含值1
  1. 删除键值对:
map.remove("apple"); //删除键"apple"对应的键值对
  1. 遍历键值对:
for(Map.Entry<String, Integer> entry : map.entrySet()){
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + " : " + value);
}

Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
    Map.Entry<String, Integer> entry = iterator.next();
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println(key + " : " + value);
}

需要注意的是,Map接口中的键是唯一的,不允许重复,如果重复添加相同的键,后面的值会覆盖前面的值。另外,LinkedHashMap是Map接口的有序实现类,它会根据元素的插入顺序进行排序。

五. Queue接口:

Queue接口是集合框架中用于表示队列的接口,它继承自Collection接口。Queue接口支持元素的插入和移除操作,Queue接口的常见实现类有:

  1. LinkedList:基于双向链表实现的队列,可以作为Queue接口的实现类。

  2. ArrayDeque:基于数组实现的双端队列,也可以作为Queue接口的实现类。

  3. PriorityQueue:基于优先级堆实现的队列,可以根据元素的优先级进行插入和删除操作。注意,它不是严格意义上的队列,因为删除元素时不一定按照插入的顺序进行。

  4. ConcurrentLinkedQueue:线程安全的非阻塞队列,基于链表实现,支持多线程并发操作。
    除了这些常见的实现类之外,还可以通过继承AbstractQueue类或实现Queue接口来创建自定义的Queue实现类。下面举例说明Queue接口的用法:

  5. 创建Queue并添加元素:

Queue<Integer> queue = new LinkedList<>();
queue.offer(1); //插入元素1
queue.offer(2); //插入元素2
queue.offer(3); //插入元素3
  1. 获取并移除队列的头部元素:
int head = queue.poll(); //获取并移除队列的头部元素,此时head的值为1
  1. 获取但不移除队列的头部元素:
int head = queue.peek(); //获取但不移除队列的头部元素,此时head的值为2
  1. 判断队列是否为空:
boolean isEmpty = queue.isEmpty(); //判断队列是否为空,此时isEmpty的值为false
  1. 获取队列的大小:
int size = queue.size(); //获取队列的大小,此时size的值为2

需要注意的是,LinkedList实现了Deque接口,因此可以被当作双端队列使用。PriorityQueue是一个基于优先级堆的无界优先级队列,它根据元素的自然顺序或者指定的Comparator进行排序。

六. Stack类:

Stack类是Java中表示后进先出(LIFO)的堆栈的类,它继承自Vector类,实现了栈的基本操作。下面举例说明Stack类的用法:

  1. 创建Stack对象并添加元素:
Stack<Integer> stack = new Stack<>();
stack.push(1); //将元素1推入栈顶
stack.push(2); //将元素2推入栈顶
stack.push(3); //将元素3推入栈顶
  1. 获取并移除栈顶元素:
int top = stack.pop(); //获取并移除栈顶元素,此时top的值为3
  1. 获取但不移除栈顶元素:
int top = stack.peek(); //获取但不移除栈顶元素,此时top的值为2
  1. 判断栈是否为空:
boolean isEmpty = stack.isEmpty(); //判断栈是否为空,此时isEmpty的值为false
  1. 获取栈的大小:
int size = stack.size(); //获取栈的大小,此时size的值为2

需要注意的是,Stack类是线程安全的,但因为它继承自Vector类,所以性能上可能不如使用LinkedList实现的双端队列。因此,如果只需要使用栈的功能,推荐使用Deque接口的实现类LinkedList来代替Stack类。

七. Iterator接口:

用于迭代访问集合中的元素。
Iterator接口是Java中用于迭代访问集合中元素的接口,通过它可以依次访问集合中的每个元素。下面举例说明Iterator接口的用法:

  1. 创建Iterator对象并遍历集合:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");

Iterator<String> iterator = list.iterator(); //获取Iterator对象

while (iterator.hasNext()) { //判断是否还有下一个元素
    String element = iterator.next(); //获取下一个元素
    System.out.println(element);
}

输出结果:

apple
banana
orange
  1. 在遍历过程中删除元素:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");

Iterator<String> iterator = list.iterator(); //获取Iterator对象

while (iterator.hasNext()) {
    String element = iterator.next();
    if (element.equals("banana")) {
        iterator.remove(); //删除当前元素
    }
}

System.out.println(list);

输出结果:

[apple, orange]

需要注意的是,Iterator接口的迭代器是单向的,只能从前往后遍历,而且在遍历过程中不能修改集合的结构(除了使用Iterator的remove方法)。

Java SE中的集合框架提供了丰富的方法和工具类,可以方便地对集合进行操作和处理。它提供了高性能的数据结构,可以应对不同的应用场景和需求。

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

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

相关文章

微服务之远程调用

常见的远程调用方式 RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&#xff0c;基于原生TCP通信&#xff0c;速度快&#xff0c;效率高。早期的webservice&#xff0c;现在热门的dubbo &#xff08;12不再维护、17年维护权交给apac…

【设计模式】行为型设计模式之 迭代器模式

介绍 迭代器模式&#xff08;Iterator Pattern&#xff09; 是行为设计模式之一&#xff0c;它提供了一种访问集合对象&#xff08;如列表、数组或其他集合结构&#xff09;中元素的方式&#xff0c;而不需要暴露集合的内部结构。迭代器模式定义了一个迭代器接口&#xff0c;该…

专业学习|南开大学《随机过程》学习笔记(一)

&#xff08;1&#xff09;有哪些经典的关于基本随机过程的书籍推荐&#xff1f; 对于想要系统学习基本随机过程的学生来说&#xff0c;可以参考Sheldon M.Rose编著的经典著作《随机过程》。该书涉及的内容也比较宽泛。但并不局限于单个细节论证。 此外&#xff0c;萨缪尔科林(…

Vulnhub靶机之reven 1

一、信息收集 nmap扫描网段&#xff0c;靶机地址为192.168.145.129。 nmap -sP 192.168.145.* 扫一下端口&#xff0c;开放了22、80、111、50967。 nmap -sT -T4 -p1-65535 192.168.145.129 再看一下目录情况&#xff0c;发现一个疑似后台登录的地址。 dirsearch -u http://…

DeepSeek-7B-chat 4bits量化 Qlora 微调

在本文中我们将学习DeepSeek量化微调的方法&#xff0c;并且从微调结果体会大模型微调的重要性。 引言 在当前快速发展的自然语言处理领域&#xff0c;模型的精度和效率是关键。量化和微调技术可以有效提高模型性能。本文将探讨如何对DeepSeek-7B-chat模型进行4bits量化&…

Linux | buildrootfs 添加mkfs.ext3/mkfs.ext4 支持

因个人需要&#xff0c;mkfs.ext3 但是项目中还没有这个命令 所以琢磨了半天 这里将其小记一下 在buildrootfsz中&#xff0c;需要将e2fsprogs 勾选上然后重新编译就好了 make menuconfig Target packages-> Filesystem and flash utilities-> e2fsprogs

stm32编写Modbus步骤

1. modbus协议简介&#xff1a; modbus协议基于rs485总线&#xff0c;采取一主多从的形式&#xff0c;主设备轮询各从设备信息&#xff0c;从设备不主动上报。 日常使用都是RTU模式&#xff0c;协议帧格式如下所示&#xff1a; 地址 功能码 寄存器地址 读取寄存器…

springCloudAlibaba之分布式事务组件---seata

Seata Sea学习分布式事务Seata二阶段提交协议AT模式 Sea学习 事务&#xff1a;事务是访问数据库并更新数据库中各项数据的一个程序执行单元。在关系数据库中&#xff0c;一个事务由一组或多组SQL语句组成。事务应该具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。例如…

数据交换平台_10_activatemq 中间件容错性测试

目录概要 3. 容错测试: - 模拟ActiveMQ在异常情况下的表现,如网络中断、节点故障等。 - 观察ActiveMQ的容错机制是否能够正确处理异常情况,保证消息的可靠传输。 - 根据容错测试结果,优化ActiveMQ的容错机制,确保系统在面对异常情况时能够正确处理并恢复。 设计: 容错测…

WPF-UI布局

WPF布局元素有如下几个&#xff1a; Grid&#xff1a;网格。可以自定义行和列并通过行列的数量、行高和列宽来调整控件的布局。StackPanel&#xff1a;栈式面板。可将包含的元素在竖直或水平方向上排成一条直线&#xff0c;当移除一个元素后&#xff0c;后面的元素会自动向前移…

鸿蒙HarmonyOS中的ohpm相关知识点总结

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 OHPM是什么&#xff1f;一、OpenHarmony三方库中心仓网站&#xff08;website&#xff09;&#xff1a;用于检索、查看所需 OpenHarmony 三方库信息&#xff0c;也可…

二维鱼游CFD代码

最近学了会Julia&#xff0c;参考了原作者的shark&#xff0c;做一下基于airfoils 2D的鱼游&#xff0c;暂时没想好有什么需要深入研究的&#xff0c;代码公开如下&#xff1a; 鱼身是naca0016&#xff0c;然后一些参数可以参考我以前发的论文。 using WaterLily, StaticArra…

如何解决网络问题?

组织和 IT 管理员尽其所能完善他们的网络&#xff0c;但是&#xff0c;不同程度的网络问题仍然可能出现&#xff0c;这些网络问题需要立即响应和解决&#xff0c;如果这些问题在不合理的时间内得不到解决&#xff0c;网络和组织的损害可能会付出高昂的代价。这就是为什么 IT 管…

【C#线程设计】3:threadpool

实现&#xff1a; &#xff08;1&#xff09;.控件&#xff1a;group Box&#xff0c;text Box&#xff0c;check Box&#xff0c;label&#xff0c;botton&#xff0c;richtextbox 控件拉取见&#xff1a;https://blog.csdn.net/m0_74749240/article/details/139409510?spm1…

IDEA配置mybatis-config.xml模板文件

IDEA配置mybatis-config.xml模板文件 File>>Settings>>File and Code Templates 创建mybatis-config.xml模板 模板内容取自mybatis官网 mybatis官网 <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE configurationPUBLIC &qu…

怎么使用手机远程访问电脑文件?(3种方法)

手机远程访问电脑文件 “有时&#xff0c;当我离开电脑时&#xff0c;仍然需要访问和使用桌面上的文件。是否有一种工具可以通过WiFi而不是USB连接&#xff0c;让我的手机远程访问电脑上的文件&#xff1f;如果有任何建议&#xff0c;我将非常感激&#xff01;” 除了希望手机…

c++引用的本质(反汇编角度分析)

目录 一、引用基础理论 二、 引用的本质 三、从反汇编角度进行分析 1.变量赋值 2.引用和指针初始化 3.通过引用和指针赋值 4.eaxd的作用 一、引用基础理论 在c中我们都知道&#xff0c;引用&#xff08;&&#xff09;就是变量的一个别名&#xff0c;它允许我们为已存…

上市公司-市场竞争程度(1999-2023年)赫份达尔、勒纳指数数据集

数据年份&#xff1a;1999-2023年 有效样本&#xff1a;64505条 数据来源&#xff1a;上市公司年报 数据说明&#xff1a; ① 在行业层面&#xff0c;赫芬达尔指数可衡量一个公司在市场中的相对份额或集中度。它是由每家公司在市场中份额的平方和得到的。指数值越高&#x…

idea打开hierarchy面板

hierarchy&#xff1a;查看类层级关系图 不同版本的IDEA的快捷键不一样&#xff0c;同时如果修改了IDEA快捷键&#xff0c;也可能会不一样&#xff0c;具体查看可通过IDEA上方的Navigate来查看navigate--Type Hierarchy&#xff0c;就可以看见其快捷键了&#xff0c;我的快捷键…

数据结构--递归和数组

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…