【面试干货】Java集合类详解:List、Set、Queue、Map、Stack的特点与用法

【面试干货】Java集合类详解:List、Set、Queue、Map、Stack的特点与用法

  • 1、Map
    • 1.1 特点
    • 1.2 用法
    • 1.3 常见的实现类
  • 2、Set
    • 2.1 特点
    • 2.2 用法
    • 2.3 常见的实现类
  • 3、List
    • 3.1 特点
    • 3.2 用法
    • 3.3 常见的实现类
  • 4、Queue
    • 4.1 特点
    • 4.2 用法
    • 4.3 常见的实现类
  • 5、Stack
    • 5.1 特点
    • 5.2 用法(但不建议直接使用Stack类)
  • 6、用法总结建议


💖The Begin💖点点关注,收藏不迷路💖

在Java中,集合类(Collections Framework)是一个非常重要的部分,它提供了多种数据结构的实现,以便我们在开发中更方便地管理和操作数据。

本文将详细介绍Java中的几种主要集合类:List、Set、Queue、Map和Stack的特点和用法。

1、Map

Map是一个键值对集合,键(Key)唯一不能重复,一个键对应一个值(Value),值可以重复。

在Map中,可以通过KeySet()方法将所有的键抽取成一个Set集合,这样就可以方便地遍历所有的键;而Values()方法则可以将Map中所有的值抽取成一个集合,同样便于对值进行遍历操作。

1.1 特点

1、键(Key)唯一不能重复。

2、可以将Key和Value单独抽取出来,例如keySet()和values()方法。

3、TreeMap可以保证顺序,HashMap不保证顺序。

1.2 用法

Map<String, Integer> map = new HashMap<>();  map.put("One", 1);  map.put("Two", 2);  
System.out.println(map.get("One")); // 输出 1

1.3 常见的实现类

1、HashMap:基于哈希表实现,不保证顺序。

2、LinkedHashMap:基于链表和哈希表实现,维护插入顺序。

3、TreeMap:基于红黑树实现,保证键的自然顺序或自定义排序。

Map<String, Integer> hashMap = new HashMap<>();hashMap.put("a", 1);hashMap.put("b", 2);Map<String, Integer> treeMap = new TreeMap<>();treeMap.put("c", 3);treeMap.put("d", 4);Map<String, Integer> linkedHashMap = new LinkedHashMap<>();linkedHashMap.put("e", 5);linkedHashMap.put("f", 6);linkedHashMap.put("g", 7);

2、Set

Set是一个不包含重复元素的集合。

2.1 特点

1、元素唯一不重复。

2、Set中最多包含一个null元素。

3、只能使用Iterator实现单项遍历。

4、Set 中没有同步方法。

2.2 用法

Set<String> set = new HashSet<>();  set.add("Apple");  set.add("Banana");  set.add("Apple"); // 不会添加重复元素  
for (String fruit : set) {  System.out.println(fruit);  
}

2.3 常见的实现类

1、HashSet:基于哈希表实现,不保证顺序。

2、LinkedHashSet:基于链表和哈希表实现,维护插入顺序。

3、TreeSet:基于红黑树实现,保证元素的自然顺序或自定义排序。

用法示例:

Set<String> hashSet = new HashSet<>();hashSet.add("one");hashSet.add("two");Set<String> treeSet = new TreeSet<>();treeSet.add("three");treeSet.add("four");Set<String> linkedHashSet = new LinkedHashSet<>();linkedHashSet.add("five");linkedHashSet.add("six");linkedHashSet.add("seven");

3、List

List是一个有序的可重复集合。

3.1 特点

1、元素有序。
2、元素可重复。
3、可以在任意位置增加、删除元素。
4、List可以使用Iterator进行单向遍历,也可以使用ListIterator进行双向遍历。

遍历示例:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;public class ListIteratorExample {public static void main(String[] args) {// 创建一个列表并添加一些元素List<String> list = new ArrayList<>();list.add("A");list.add("B");list.add("C");list.add("D");// 使用 Iterator 进行单向遍历System.out.println("使用 Iterator 遍历列表:");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String element = iterator.next();System.out.print(element + " ");}System.out.println();// 使用 ListIterator 进行双向遍历System.out.println("\n使用 ListIterator 进行双向遍历:");ListIterator<String> listIterator = list.listIterator();// 向前遍历列表System.out.println("向前遍历:");while (listIterator.hasNext()) {String element = listIterator.next();System.out.print(element + " ");}System.out.println();// 向后遍历列表System.out.println("向后遍历:");while (listIterator.hasPrevious()) {String element = listIterator.previous();System.out.print(element + " ");}System.out.println();}
}

在这里插入图片描述

3.2 用法

List<String> list = new ArrayList<>();  list.add("First");  list.add("Second");  list.add(1, "Inserted"); // 在索引1处插入元素  
System.out.println(list.get(1)); // 输出 Inserted

3.3 常见的实现类

1、ArrayList:基于动态数组,支持快速随机访问。

2、LinkedList:基于双向链表,适合需要频繁插入和删除元素的场景。

用法示例:

List<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);List<Integer> linkedList = new LinkedList<>();linkedList.add(3);linkedList.add(4);

4、Queue

Queue是一个遵循先进先出(FIFO)原则的集合。

4.1 特点

1、遵循FIFO原则。

2、使用offer()添加元素,poll()移除元素,可以通过返回值判断操作是否成功。

3、通常不允许插入null元素。

4.2 用法

Queue<String> queue = new LinkedList<>();  queue.offer("First");  queue.offer("Second");  
System.out.println(queue.poll()); // 输出 First

4.3 常见的实现类

1、LinkedList:可以作为队列使用,支持双端队列。

2、PriorityQueue:基于优先级堆实现,元素按优先级顺序出队。

Queue<Integer> linkedList= new LinkedList<>();queue.offer(1);queue.offer(2);
Integer head = linkedList.poll();Queue<Integer> priorityQueue = new PriorityQueue<>();// 添加元素到优先级队列priorityQueue.offer(5);priorityQueue.offer(1);priorityQueue.offer(3);// 获取并移除队列头部的元素
Integer head = priorityQueue.poll();

5、Stack

Stack是一个遵循后进先出(LIFO)原则的集合。

5.1 特点

1、遵循LIFO原则。

2、提供了push()、pop()、peek()等方法。

3、Stack继承自Vector,但通常不建议直接使用Stack,因为Vector是同步的,而Stack的方法并不是线程安全的。

5.2 用法(但不建议直接使用Stack类)

Deque<String> stack = new ArrayDeque<>(); // 使用Deque实现Stack的功能  stack.push("First");  stack.push("Second");  
System.out.println(stack.pop()); // 输出 Second

尽管Stack类存在,但在实际开发中,建议使用Deque接口及其实现类(如ArrayDeque)来代替,因为Deque提供了更丰富的功能和更好的性能。

6、用法总结建议

1、如果涉及堆栈或队列操作,建议使用List或Deque。

2、对于快速插入和删除元素,建议使用LinkedList。

3、如果需要快速随机访问元素,建议使用ArrayList。

但实际上:如果涉及堆栈,队列等操作,对于Stack和Queue,应该使用专门为此设计的集合类(如Deque和Queue接口的实现类),因为它们提供了更适合这些数据结构操作的方法。

对于快速插入和删除元素的场景,LinkedList是一个很好的选择,因为它在列表的任意位置插入和删除元素的时间复杂度都是O(1)。

如果需要快速随机访问元素,则应该使用ArrayList,因为ArrayList是基于数组实现的,可以通过索引快速访问元素。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

FastWeb - Lua开源跨平台网站开发服务

在网站开发领域&#xff0c;大家都熟知PHPStudy和宝塔这两款广受欢迎的工具&#xff0c;但今天我要介绍的是一款功能强大、支持跨平台的开源Lua网站开发服务——Fast Web&#xff0c;以及与之配套的网站管理器。 Fast Web简介 Fast Web是一款基于Lua编写的网站开发框架&#…

注解 - @ResponseStatus

注解简介 在今天的每日一注解中&#xff0c;我们将探讨ResponseStatus注解。ResponseStatus是Spring框架中的一个注解&#xff0c;用于为控制器方法指定HTTP响应状态码和理由短语。 注解定义 ResponseStatus注解用于标记控制器方法或异常类&#xff0c;以指示HTTP响应的状态码…

基于Flask+Mysql+EasyUI的简单用户管理系统

1、系统实现功能 添加用户查看用户修改用户删除用户 完整代码下载地址在最后&#xff0c;若显示链接不存在&#xff0c;可能是资源还没有审核&#xff0c;可私聊我发完整代码。 2、功能实现 2.1 添加用户 构建添加用户的Flask接口add_user() app.route("/add/user&quo…

依赖自动装配

黑马程序员SSM框架 文章目录 1、依赖自动装配2、依赖自动装配的特征 1、依赖自动装配 IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配自动装配方式 按类型&#xff08;常用&#xff09;按名称按构造方法不启用自动装配 配置中使用bean标签auto…

使用 MPLS 解决 BGP 的路由黑洞

MPLS 协议并不会为通过 BGP 协议学习的路由条目分配标签号&#xff1b; 而是在访问这些 BGP 路由目标网段时&#xff0c;在流量中压入到达这些网段的 BGP 下一跳设备地址的标签号&#xff1b; 例&#xff1a;R2从BGP邻居5.5.5.5学习到6.6.6.0 网段的路由&#xff1b;R2在访问…

网络编程入门介绍:TCP 和 UDP

目录 简介TCP&#xff1a;传输控制协议 TCP 的特点TCP 如何工作TCP 示例TCP 实践样例 UDP&#xff1a;用户数据报协议 UDP 的特点UDP 如何工作UDP 示例UDP 实践样例 TCP 与 UDP 的比较总结 简介 在计算机网络中&#xff0c;TCP&#xff08;传输控制协议&#xff09;和 UDP&a…

2024年6月15日 十二生肖 今日运势

小运播报&#xff1a;2024年6月15日&#xff0c;星期六&#xff0c;农历五月初十 &#xff08;甲辰年庚午月庚戌日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;兔、马、虎 需要注意&#xff1a;牛、鸡、龙 喜神方位&#xff1a;西北方 财神方位&#xff1a;…

AI 客服定制:LangChain集成订单能力

为了提高AI客服的问题解决能力&#xff0c;我们引入了LangChain自定义能力&#xff0c;并集成了订单能力。这使得AI客服可以根据用户提出的问题&#xff0c;自动调用订单接口&#xff0c;获取订单信息&#xff0c;并结合文本知识库内容进行回答。这种能力的应用&#xff0c;使得…

使用powershell筛选AD域控不能自主更改的用户并变更

# 查询“用户不能更改密码”为勾选状态的所有域用户&#xff0c;将域账户、姓名、勾选状态作为结果保存到C:\result\result.csvGet-ADUser -Filter * -Properties CannotChangePassword | Where-Object { $_.CannotChangePassword -eq $true } | Select SamAccountName, Name, …

班子考核评价的重要性与实施方法

在组织管理领域&#xff0c;班子考核评价是一项至关重要的工作&#xff0c;它不仅关系到组织的发展方向和速度&#xff0c;更直接影响到组织的凝聚力和战斗力。一个科学、公正、有效的班子考核评价体系&#xff0c;能够准确反映班子的工作成效&#xff0c;激励班子成员积极作为…

QML学习及实战

QML学习及实战&#xff08;更多内容&#xff09; 创建项目 3. 剩下的就是一路下一步即可 添加静态资源——图片 添加之后完成之后的路径 案列 || demo 可以参考的资料&#xff1a;https://github.com/gongjianbo/MyTestCode/blob/master/README.md 1. 文本省略号 Text {wi…

第二十三节:带你梳理Vue2:Vue插槽的认识和基本使用

前言: 通过上一节的学习,我们知道了如何将数据从父组件中传递到子组件中, 除了除了将数据作为props传入到组件中,Vue还允许传入HTML, Vue 实现了一套内容分发的 API&#xff0c;这套 API 的设计灵感源自 Web Components 规范草案&#xff0c;将 <slot> 元素作为承载分发…

系统思考与创新解决

结束了为期两天的《系统思考与创新解决》课程&#xff0c;专为上市公司中后台管理者设计。这次课程让我深刻感受到中后端管理者与前端管理者在心智模式上的显著差异。通过使用系统环路图&#xff0c;不仅揭示了这些差异&#xff0c;还探讨了如何利用这些见解来增强团队间的对话…

13. 第十三章 案例研究-选择数据结构

13. 案例研究-选择数据结构 到这里尼应该已经学会了Python的核心数据结构, 也见过了一些使用它们的算法. 如果你想要更多地了解算个发可以阅读第21章. 本章配合联系介绍一个案例分析, 帮你思考如何选择数据结构并如何使用它们.13.1 单词频率分析 1. 练习1 编写一个程序, 读入…

《站在2024年的十字路口:计算机专业是否仍是高考生的明智之选?》

文章目录 每日一句正能量前言行业竞争现状行业饱和度和竞争激烈程度[^3^]新兴技术的影响[^3^]人才需求的变化[^3^]行业创新动态如何保持竞争力 专业与个人的匹配度判断专业所需的技术能力专业核心课程对学生的要求个人兴趣和性格特点专业对口的职业发展要求实践和经验个人价值观…

vue+intro.js实现引导功能

前言&#xff1a; 使用 intro.js这个插件&#xff0c;来实现一个引导性的效果&#xff0c;适用场景&#xff0c;比如&#xff1a;新手引导页&#xff0c;操作说明等等 效果图&#xff1a; 官网地址&#xff1a;点我 实现步骤&#xff1a; 1、安装 npm install intro.js --sa…

【架构之路】聊聊什么是微服务

如何让大模型更聪明&#xff1f; 引言 微服务&#xff08;Microservices&#xff09;是一种软件架构风格&#xff0c;它将单一的应用程序拆分为多个小的服务&#xff0c;每个服务都是独立运行和部署的。每个微服务通常只专注于一个业务功能&#xff0c;具有自己的数据存储&…

JavaScript 实现数字计数器的动画效果

写JavaScript 实现数字递增的效果 在HTML页面实现数字计数器的动画效果&#xff0c;类似于页面上的计数器功能&#xff0c;可以控制递增速度和效果的流畅度。主要是显示数字时流畅度更好&#xff0c;页面没那么僵硬 1、第一种 设置每次增加的数量&#xff0c;我这里演示的是…

【UIDynamic-动力学-UIGravityBehavior-重力行为 Objective-C语言】

一、UIGravityBehavior,重力行为, 1.接下来啊,我们一个一个来做, 新建一个项目,叫做:01-重力, 接下来,我们在这个ViewController里边, ViewDidLoad:里边,先写一段简单的代码, 我们写这么一段简单的代码,新建一个红色的UIView,把它显示在屏幕上, UIView *redVie…

《征服数据结构》双端栈

摘要&#xff1a; 1&#xff0c;双端栈的介绍 2&#xff0c;双端栈的代码实现 1&#xff0c;双端栈的介绍 双端栈主要利用了“栈底位置不变&#xff0c;栈顶位置动态变化” 的特点&#xff0c;可以让两个栈共享一块存储空间。在前面我们讲到用数组实现栈的时候&#xff0c;如果…