java中集合List,Set,Queue,Map

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

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

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

相关文章

kafka-生产者事务-数据传递语义事务介绍事务消息发送(SpringBoot整合Kafka)

文章目录 1、kafka数据传递语义2、kafka生产者事务3、事务消息发送3.1、application.yml配置3.2、创建生产者监听器3.3、创建生产者拦截器3.4、发送消息测试3.5、使用Java代码创建主题分区副本3.6、屏蔽 kafka debug 日志 logback.xml3.7、引入spring-kafka依赖3.8、控制台日志…

推荐云盘哪个好,各有各的优势

选择合适的云盘服务是确保数据安全、便捷分享和高效协作的关键。下面将从多个维度对目前主流的云盘服务进行详细的对比和分析&#xff1a; 速度性能 百度网盘青春版&#xff1a;根据测试&#xff0c;其上传和下载确实不限速&#xff0c;但主要定位是办公人群&#xff0c;适用于…

JavaScript基础(十二)

截取字符串 //对象名.toLowerCase();将字符串转为小写 var strLAOWANG; strstr.toLowerCase(); console.log(str); //对象名.toUpperCase();将字符串转为大写 var str1laowang str1str1.toUpperCase(); console.log(str1); 截取字符串 //方法1&#xff1a;对象名.substr(a,b); …

JS(JavaScript)的引用方式介绍与代码演示

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

android 抓取 logcat 日志的方法

1.找到这个路径 2.然后执行命令&#xff08;adb logcat -v time >.\\logcat.log&#xff09;&#xff0c;开始抓取日志 3.这个时候就可以去操作APP了&#xff0c;复现BUG了。 Ctrlc 结束日志抓取 adb logcat -c 清空旧日志

seerfar选品功能,OZON运营插件工具seerfar

在当今这个数字化、信息化的时代&#xff0c;电子商务的飞速发展使得越来越多的商家开始关注如何更高效地运营自己的在线店铺。其中&#xff0c;选品作为电商运营的重要一环&#xff0c;直接影响着店铺的流量、转化率和利润。在OZON这样的电商平台上&#xff0c;如何快速、准确…

7天搞定Python必背500单词

必备必记-你的Python就牛掰了 每天只背100个就足够了 老话说的好基础不扎实,地动山摇,在学习Python的时候前期基础很重要. 下面是大家常用遇到的Python基础单词,帮助你更好地掌握Python语言: 1.变量 在Python中用来存储数值,文本或其他信息的名称. 2. 函数 用于执行特定…

力扣2444.统计定界子数组的数目

力扣2444.统计定界子数组的数目 观察到不满足条件的数 可以作为天然的分割线 因此在枚举右端点的过程中 预处理minK&#xff0c;maxK和分割线上一次出现的下标 res min(min_i,max_i) - i0; 但是因为可能在到下个区段时 min_i和max_i尚未更新 导致结果为负数 所以要跟0再取一…

linux:如何硬盘分区扩容

文章目录 1. 前言2. 硬盘分区2.1 查看硬盘2.2 分区2.3 格式化 3. 硬盘分区扩容3.1 创建物理卷3.2 扩展到卷组&#xff08;volume group&#xff09;3.3 合并到待拓展分区3.4 使扩展生效 4 .参考 1. 前言 本文介绍如何将剩余的空间扩展到已有的硬盘分区中。 安装虚拟机的教程&…

VBA高级应用30例应用2实现在列表框内及列表框间实现数据拖动

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…

离散数学答疑 4

知识点&#xff1a;什么是可结合&#xff1f; 举例A选项&#xff1a; 知识点&#xff1a;可交换性? 知识点&#xff1a;什么是阿贝尔群&#xff1f; 可交换->运算表中的元素关于主对角线对称 二阶子群的表达式 二阶子群作为一个群的子群&#xff0c;其本质是一个包含单位元…

11 gpio 与 pinctrl 子系统

1、GPIO 硬件结构 GPIO 是通用输入/输出端口的简称。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 八种工作模式 GPIO_Mode_AIN 模拟输入 GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_IPU 上拉输入GP…

深度学习中几种常见数据标准化方法

目录 一、介绍 二、总结 三、详情 1. StandardScaler 2. MinMaxScaler 3. RobustScaler 4. MaxAbsScaler 5. Normalizer 6. QuantileTransformer 7. PowerTransformer 8. Log Transform 四、示例 五、心得 一、介绍 方法名称缩放范围适用条件StandardScaler均值…

实用软件分享---简单菜谱 0.3版本 几千种美食(安卓)

专栏介绍:本专栏主要分享一些实用的软件(Po Jie版); 声明1:软件不保证时效性;只能保证在写本文时,该软件是可用的;不保证后续时间该软件能一直正常运行;不保证没有bug;如果软件不可用了,我知道后会第一时间在题目上注明(已失效)。介意者请勿订阅。 声明2:本专栏的…

IO-源码阅读 glibc 2.35

文章目录 参考缓存机制IO_FILE_PLUSfopenfopen_internal_IO_no_init_IO_old_init _IO_new_file_init_internal_IO_link_in _IO_new_file_fopen_IO_file_open fread_IO_fread_IO_sgetn_IO_doallocbuf_IO_file_doallocate_IO_file_stat_IO_setb __underflow_IO_new_file_underflo…

深入Llama2:掌握未来语言模型的秘密

Llama2是一个基于Transformer架构的大型语言模型&#xff0c;它旨在处理和理解大规模的文本数据。作为技术人员&#xff0c;了解Llama2的工作原理、模型结构和训练方法对于有效利用该模型至关重要。本文将详细介绍Llama2的基本概念、主要作用、使用方法及注意事项。 一、简介 …

Linux---Linux编译器-gcc与g++的使用

GCC是以GPL许可证所发行的自由软件&#xff0c;也是GNU计划的关键部分。GCC的初衷是为GNU操作系统专门编写一款编译器&#xff0c;现已被大多数类Unix操作系统&#xff08;如Linux、BSD、MacOS X等&#xff09;采纳为标准的编译器。 gcc是专门用来编译C语言的&#xff0c;而g是…

VSC++: 民意调查比例法

void 民意调查比例法() {//缘由https://bbs.csdn.net/topics/396521294?page1#post-411408461从题目描述看&#xff1a;902/3~300.7&#xff0c;1498/5~299.6也就是大约求2个数的公约数&#xff0c;并使得这个公约数尽量求出最小误差&#xff1f;且商小于某值。int a 0, aa …

Django Forbidden (CSRF cookie not set.)解决办法

解决办法就是在setting.py文件中注释&#xff1a; django.middleware.csrf.CsrfViewMiddleware, 这个中间件是为了防止跨站请求伪造的&#xff0c;平时用网页表单请求时&#xff0c;post提交是没有问题的&#xff0c;但是用api调用时就会被禁止&#xff0c;为了能使用接口调用…

【Java面试】十七、并发篇(上)

文章目录 1、synchronized关键字的底层原理&#xff1a;Monitor2、synchronized相关2.1 为什么说synchronized是重量级锁2.2 synchronized锁升级之偏向锁2.3 synchronized锁升级之轻量级锁 3、Java内存模型JMM4、CAS4.1 CAS流程4.2 CAS底层实现 5、volatile关键字的理解5.1 可见…