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

news2025/2/24 13:34:36

【面试干货】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.coloradmin.cn/o/1824263.html

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

相关文章

瀑布流布局:图片浏览页面

目录 任务描述 相关知识 HTML(HyperText Markup Language) 瀑布流布局&#xff1a; 题目 任务描述 在本关中&#xff0c;你的任务是理解瀑布流布局&#xff0c;以展示多张图片。瀑布流布局使得图片能够按照设定的列数依次排列&#xff0c;每列的高度会根据图片的高度自动调…

【单片机毕业设计选题24007】-基于STM32和阿里云的家庭健康数据监测系统

系统功能: 本课题设计是基于STM32单片机作为控制主体&#xff0c;通过HX711称重模块&#xff0c;HC-SR04超声波测距模块&#xff0c;红外测温&#xff0c;心率传感器等模块通过I2C或SPI接口与STM32进行通信&#xff0c;并读取传感器输出的身高&#xff0c;体重&#xff0c;心率…

一年前 LLM AGI 碎片化思考与回顾系列④ · 从System2→Post-training的疑虑和思考

阅读提示&#xff1a; 本篇系列内容的是建立于自己过去一年在以LLM为代表的AIGC快速发展浪潮中结合学术界与产业界创新与进展的一些碎片化思考并记录最终沉淀完成&#xff0c;在内容上&#xff0c;与不久前刚刚完稿的那篇10万字文章 「融合RL与LLM思想&#xff0c;探寻世界模型…

B+索引的分裂及选择率和索引基数

1、B树索引的分裂 B树索引页的分裂并不总是从页的中间记录开始&#xff0c;这样可能会导致页空间的浪费。 例子 比如下面这个记录&#xff1a; 1、2、3、4、5、6、7、8、9 由于插入是以自增的顺序进行的&#xff0c;若这时插入第10条记录然后进行页的分裂操作&#xff0c;那…

QChar转换为Unicode,判断数字、字母、符号、标点

实现 QChar转换为Unicode&#xff0c;判断数字、字母、符号、标点等 #include "widget.h" #include "ui_widget.h" #include "QMessageBox"widget::widget(QWidget *parent): QWidget(parent), ui(new Ui::widget) {ui->setupUi(this); }widg…

Java 网站开发入门指南:如何用java写一个网站

Java 网站开发入门指南&#xff1a;如何用java写一个网站 Java 作为一门强大的编程语言&#xff0c;在网站开发领域也占据着重要地位。虽然现在 Python、JavaScript 等语言在网站开发中越来越流行&#xff0c;但 Java 凭借其稳定性、可扩展性和丰富的生态系统&#xff0c;仍然…

TF-IDF算法详细介绍

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种用于信息检索和文本挖掘的统计方法&#xff0c;旨在评估一个词在文档集合或语料库中的重要性。它是计算机科学和文本分析中最常用的特征提取技术之一。本文将详细介绍TF-IDF的基本概念、计算方法…

CentOS7.9 安装jdk17

切换到目录 /usr/local/src cd /usr/local/src下载压缩包 wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz解压 tar -zxvf jdk-17_linux-x64_bin.tar.gz添加环境变量 vim /etc/profile重加载环境变量 export JAVA_HOME/usr/local/usr/jdk-1…

AI影像时代来临,联发科天玑以专业无畏精神重新定义手机专业影像

近期&#xff0c;联发科与Discovery探索频道联合举办了一场以“越极境&#xff0c;见芯境”为主题的天玑影像展&#xff0c;活动地点位于我国桂林阳朔。活动现场展示了阳朔壮美山水的画卷&#xff0c;以及救援队员在岩壁上进行训练的极限瞬间。令人意想不到的是&#xff0c;这些…

DockerHub无法访问,国内镜像拉取迂回解决方案

无法访问后&#xff0c;主要存在以下几个问题&#xff1a; 无法进行镜像的搜索无法查看镜像相关的使用说明无法直接拉取镜像 对于第二点&#xff0c;目前没啥解决思路&#xff0c;主要针对第一点和第三点。 解决无法搜索镜像 目前仅可以解决部分问题&#xff0c;在知道镜像名…

基于 Redis 实现分布式缓存

一、单节点 Redis 的问题 1.1 存在的问题 1、数据丢失问题&#xff1a;Redis 是内存存储&#xff0c;服务重启可能会丢失数据。 2、并发能力问题&#xff1a;单节点 Redis 并发能力虽然不错&#xff0c;但也无法满足如 618 这样的高并发场景。 3、故障恢复问题&#xff1a;如果…

小白跟做江科大32单片机之定时器

原理部分 1. 计数器每遇到一个上升沿就会计数值1,。 72MHZ72000000 72000000/65536/655360.0167638063430786132812559.652323555555554 (s) 2. 3. 计数时钟每来一个上升沿&#xff0c;计数值1&#xff0c;自动运行。如果计数值与存储在自动重装载寄存器中的值相等&#…

2024 年最新 Python 基于百度智能云实现短语音识别、语音合成详细教程

百度智能云语音识别 采用国际领先的流式端到端语音语言一体化建模算法&#xff0c;将语音快速准确识别为文字&#xff0c;支持手机应用语音交互、语音内容分析、机器人对话等场景。百度短语音识别可以将 60 秒以下的音频识别为文字。适用于语音对话、语音控制、语音输入等场景…

C++ 32 之 静态成员函数

#include <iostream> #include <string> using namespace std;// 特点: // 1.在编译阶段就分配了内存空间 // 2.类内声明&#xff0c;在类外进行初始化 // 3.所有对象共享一份静态成员数据 class Students02{ public:int s_c;static int s_d;// 静态成员函数&#…

重装了mysql,然后安装为服务时,net start 启动一直报错,MySQL服务无法启动的解决

之前写过一篇关于安装mysql的文章&#xff0c;按上面的处理&#xff0c;基本上是可以的。 今天换了下目录&#xff0c;重新安装&#xff0c;一直报错。 然后我们来看一下问题&#xff1a; mysqld -console 这里的目录是有问题的&#xff0c;设置的是&#xff1a;datadird:\to…

如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题

&#x1f6e0;️ 如何完美解决升级 IntelliJ IDEA 最新版之后遇到 Git 记住密码功能失效的问题 摘要 在这篇文章中&#xff0c;我们将详细探讨如何解决在升级到 IntelliJ IDEA 最新版&#xff08;2024.1.3 Ultimate Edition&#xff09;后遇到的 Git 记住密码功能失效的问题。…

简单Mesh多线程合并,使用什么库性能更高

1&#xff09;简单Mesh多线程合并&#xff0c;使用什么库性能更高 2&#xff09;Unity Semaphore.WaitForSignal耗时高 3&#xff09;VS编辑的C#代码注释的中文部分乱码 4&#xff09;变量IntPtr m_cachePtr切换线程后变空 这是第389篇UWA技术知识分享的推送&#xff0c;精选了…

【github】项目的代码仓库重命名

问题 有时候&#xff0c;我们先创建了远端项目仓库&#xff0c;然后就把相关code上传到远端项目仓库。 可能需要结合实际情况对远端项目仓库进行重命名。 当前仓库名称v_ttc&#xff0c;如何将他修改成v_datejs 操作步骤 1、在 GitHub.com 上&#xff0c;导航到存储库的主页…

个人关于Leecode 49题见解(保姆级)

题目&#xff1a; 49. 字母异位词分组 中等 相关标签 相关企业 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "…

边界内聚和耦合

内聚 功能内聚 功能内聚是软件工程中一个重要的概念&#xff0c;它描述了一个模块内部各个元素之间的紧密程度。一个具有高功能内聚的模块意味着其内部的各个组件都共同完成一个具体的、明确的功能&#xff0c;并且这些组件之间的联系不是偶然的&#xff0c;而是因为它们共同服…