面试JAVA集合常用方法总结

ArrayList

基于动态数组实现,支持随机索引访问,访问索引的时间复杂度O(1),非线程安全

方法用处
size()返回列表中的元素数量。
add(E e)将指定元素添加到列表末尾。
add(int index, E e)将指定元素插入到指定位置。
get(int index)返回指定索引处的元素。
remove(int index)删除指定索引处的元素。
remove(Object o)删除第一个匹配的元素。
set(int index, E e)将指定索引处的元素替换为新值。
clear()清空列表中的所有元素。
toArray()将列表转换为数组。
contains(Object o)判断列表是否包含指定元素。

ArrayList的排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class LCR074 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(3);
        list.add(1);
        list.add(2);
        
		// 默认升序排序
        Collections.sort(list); 
        System.out.println(list); // 输出:[1, 2, 3]

        // 自定义降序排序
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2.compareTo(o1); // 降序
            }
        });
        System.out.println(list); // 输出:[3, 2, 1]
    }
}

LinkedList

基于双向链表实现,不支持随机索引访问,需要O(n)的时间复杂度遍历查找。但可以向头和尾以O(1)的时间复杂度插值。

方法用法
size()返回列表中的元素数量。
isEmpty()判断列表是否为空
clear()清空列表中的所有元素
add(E e)将指定元素添加到列表末尾。
addFirst(E e)将指定元素添加到列表头部。
addLast(E e)将指定元素添加到列表尾部。
add(int index, E e)将指定元素插入到指定位置。
get(int index)返回指定索引处的元素。
first()返回列表的第一个元素。
last()返回列表的最后一个元素。
remove(int index)删除指定索引处的元素。
removeFirst()删除列表的第一个元素。
removeLast()删除列表的最后一个元素。
remove(Object o)删除第一个匹配的元素。
set(int index, E e)将指定索引处的元素替换为新值。
toArray()将列表转换为数组。
contains(Object o)判断列表是否包含指定元素。

HashMap

JDK1.7之前,HashMap是基于数组和链表实现的,JDK1.8之后,如果链表长度超过8,链表就转为红黑树。非线程安全

方法用法
put(K key, V value)将键值对添加到 HashMap 中。如果键已存在,则更新对应的值。
putIfAbsent(K key, V value)如果键不存在,则添加键值对;如果键已存在,则不更新。
get(Object key)根据键获取对应的值。如果键不存在,返回 null。
getOrDefault(Object key, V defaultValue)根据键获取对应的值。如果键不存在,返回默认值。
remove(Object key)根据键删除对应的键值对。
remove(Object key, Object value)只有当键和值都匹配时,才删除键值对。
containsKey(Object key)检查是否包含指定的键。
containsValue(Object value)检查是否包含指定的值。
size()返回 HashMap 中键值对的数量。
isEmpty()检查 HashMap 是否为空。
replace(K key, V value)替换指定键的值(键必须存在)。
replace(K key, V oldValue, V newValue)只有当键和旧值都匹配时,才替换为新值

Hashmap的遍历:

import java.util.HashMap;

public class LCR074 {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("nihao",1);
        //遍历键值对
        for (HashMap.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }
        //遍历键
        for (String key : map.keySet()) {
            System.out.println("Key: " + key);
        }
        //遍历值
        for (Integer value : map.values()) {
            System.out.println("Value: " + value);
        }
    }
}

Queue

队列是一种先进先出(FIFO)的数据结构,支持在队尾添加元素,在队头移除元素。在 Java 中,Queue 是一个接口,而 LinkedList 是 Queue 接口的一个实现类。

方法用法
add(E e)将一个元素添加到队列末尾。如果队列已满,抛出 IllegalStateException。
offer(E e)将一个元素添加到队列末尾。如果队列已满,返回 false,而不是抛出异常。
remove()移除并返回队列头部的元素。如果队列为空,抛出 NoSuchElementException。
poll()移除并返回队列头部的元素。如果队列为空,返回 null,而不是抛出异常。
element()返回队列头部的元素,但不移除它。如果队列为空,抛出 NoSuchElementException。
peek()返回队列头部的元素,但不移除它。如果队列为空,返回 null,而不是抛出异常。
size()返回队列中的元素数量。
clear()清空队列中的所有元素。
toArray()将队列转换为数组。
contains(Object o)判断队列是否包含指定元素。

常用算法:bfs

import java.util.LinkedList;
import java.util.Queue;

public class BFSExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(1);

        while (!queue.isEmpty()) {
            int current = queue.poll();
            System.out.println("Visited: " + current);

            // 添加邻接节点到队列
            queue.add(current + 1);
            queue.add(current + 2);
        }
    }
}

Stack

Stack 是 Java 中的一个类,继承自 Vector,用于实现后进先出(LIFO,Last In First Out)的栈数据结构。

方法用法
push(E item)将一个元素压入栈顶
pop()移除并返回栈顶元素。
peek()返回栈顶元素,但不移除它。
empty()判断栈是否为空。

常用算法:括号匹配、单调栈

括号匹配:使用栈检查括号是否成对匹配。

import java.util.Stack;

public class ParenthesesMatch {
    public static boolean isValid(String s) {
        Stack<Character> stack = new Stack<>(); // 使用栈来存储左括号
        for (char c : s.toCharArray()) { // 遍历字符串中的每个字符
            // 如果是左括号,压入栈中
            if (c == '(' || c == '{' || c == '[') stack.push(c);
            // 如果是右括号,检查栈顶是否匹配
            else if (stack.isEmpty() || // 栈为空,说明没有匹配的左括号
                     (c == ')' && stack.pop() != '(') || // 弹出栈顶并检查是否匹配
                     (c == '}' && stack.pop() != '{') ||
                     (c == ']' && stack.pop() != '[')) return false; // 不匹配则返回 false
        }
        return stack.isEmpty(); // 如果栈为空,说明所有括号都匹配
    }

    public static void main(String[] args) {
        System.out.println(isValid("()[]{}")); // true
        System.out.println(isValid("([)]"));   // false
    }
}

单调栈:用于解决“下一个更大元素”类问题,栈中保持单调递减。

import java.util.Stack;

public class MonotonicStack {
    public static int[] nextGreaterElement(int[] nums) {
        int[] result = new int[nums.length]; // 存储结果的数组
        Stack<Integer> stack = new Stack<>(); // 单调栈,栈底到栈顶单调递减
        for (int i = nums.length - 1; i >= 0; i--) { // 从后往前遍历数组
            // 如果栈顶元素小于当前元素,弹出栈顶(维护单调性)
            while (!stack.isEmpty() && stack.peek() <= nums[i]) stack.pop();
            // 如果栈为空,说明没有更大的元素;否则栈顶就是下一个更大元素
            result[i] = stack.isEmpty() ? -1 : stack.peek();
            // 将当前元素压入栈中
            stack.push(nums[i]);
        }
        return result;
    }

    public static void main(String[] args) {
        int[] nums = {2, 1, 2, 4, 3};
        int[] result = nextGreaterElement(nums);
        for (int num : result) System.out.print(num + " "); // 输出: 4 2 4 -1 -1
    }
}

PriorityQueue

优先队列,可以理解成有序的队列。

方法用处
add(E e)将元素插入优先队列。如果队列已满,抛出异常。
offer(E e)将元素插入优先队列。如果队列已满,返回 false。
remove()移除并返回队列头部元素(优先级最高的元素)。如果队列为空,抛出异常。
poll()移除并返回队列头部元素(优先级最高的元素)。如果队列为空,返回 null。
element()返回队列头部元素(不移除)。如果队列为空,抛出异常。
peek()返回队列头部元素(不移除)。如果队列为空,返回 null。
size()返回队列中的元素数量。
isEmpty()检查队列是否为空。
clear()清空队列中的所有元素。
contains(Object o)检查队列中是否包含指定元素。
toArray()将队列转换为数组。
iterator()返回队列的迭代器。
comparator()返回队列的比较器(如果未指定比较器,返回 null)。

(1) 最小堆优先队列,优先返回队列中最小值

import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个最小堆优先队列
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        // 添加元素
        minHeap.add(10);
        minHeap.add(5);
        minHeap.add(20);
        minHeap.add(15);

        // 输出队列中的元素(按优先级顺序)
        while (!minHeap.isEmpty()) {
            System.out.println(minHeap.poll()); // 输出: 5, 10, 15, 20
        }
    }
}

(2) 最大堆优先队列,优先返回队列中最大值

import java.util.PriorityQueue;

public class PriorityQueueExample {
    public static void main(String[] args) {
        // 创建一个最大堆优先队列
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>((a, b) -> b - a);

        // 添加元素
        maxHeap.add(10);
        maxHeap.add(5);
        maxHeap.add(20);
        maxHeap.add(15);

        // 输出队列中的元素(按优先级顺序)
        while (!maxHeap.isEmpty()) {
            System.out.println(maxHeap.poll()); // 输出: 20, 15, 10, 5
        }
    }
}

(3) 自定义对象的优先队列,自己定义排序方式

import java.util.PriorityQueue;

public class PriorityQueue2DArray {
    public static void main(String[] args) {
        int[][] array = {
            {3, 5},
            {1, 2},
            {4, 1},
            {2, 8},
            {5, 7}
        };

        // 创建一个优先队列,按第 0 列排序(最小堆)
        PriorityQueue<int[]> minHeap = new PriorityQueue<>((a, b) -> a[0] - b[0]);

        // 将二维数组的每一行加入优先队列
        for (int[] row : array) {
            minHeap.offer(row);
        }

        // 按优先级顺序输出
        while (!minHeap.isEmpty()) {
            int[] row = minHeap.poll();
            System.out.println("[" + row[0] + ", " + row[1] + "]");
        }
    }
}

常用算法:dijkstra

import java.util.*;

public class Dijkstra {

    // 定义图的边
    static class Edge {
        int target; // 目标节点
        int weight; // 边的权重

        public Edge(int target, int weight) {
            this.target = target;
            this.weight = weight;
        }
    }

    // Dijkstra 算法实现
    public static int[] dijkstra(List<List<Edge>> graph, int start) {
        int n = graph.size(); // 图中节点的数量
        int[] dist = new int[n]; // 存储从起点到每个节点的最短距离
        Arrays.fill(dist, Integer.MAX_VALUE); // 初始化为无穷大
        dist[start] = 0; // 起点到自身的距离为 0

        // 优先队列(最小堆),按距离排序
        PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1]));
        pq.offer(new int[]{start, 0}); // 将起点加入队列

        while (!pq.isEmpty()) {
            int[] current = pq.poll(); // 取出当前距离最小的节点
            int node = current[0];
            int distance = current[1];

            // 如果当前节点的距离已经大于记录的最短距离,跳过
            if (distance > dist[node]) continue;

            // 遍历当前节点的所有邻居
            for (Edge edge : graph.get(node)) {
                int neighbor = edge.target;
                int newDist = dist[node] + edge.weight;

                // 如果找到更短的路径,更新距离并加入队列
                if (newDist < dist[neighbor]) {
                    dist[neighbor] = newDist;
                    pq.offer(new int[]{neighbor, newDist});
                }
            }
        }

        return dist; // 返回起点到所有节点的最短距离
    }

    public static void main(String[] args) {
        // 示例:图的邻接表表示
        int n = 5; // 节点数量
        List<List<Edge>> graph = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            graph.add(new ArrayList<>());
        }

        // 添加边
        graph.get(0).add(new Edge(1, 4)); // 0 -> 1,权重 4
        graph.get(0).add(new Edge(2, 1)); // 0 -> 2,权重 1
        graph.get(1).add(new Edge(3, 1)); // 1 -> 3,权重 1
        graph.get(2).add(new Edge(1, 2)); // 2 -> 1,权重 2
        graph.get(2).add(new Edge(3, 5)); // 2 -> 3,权重 5
        graph.get(3).add(new Edge(4, 3)); // 3 -> 4,权重 3

        int start = 0; // 起点
        int[] dist = dijkstra(graph, start);

        // 输出结果
        System.out.println("从节点 " + start + " 到其他节点的最短距离:");
        for (int i = 0; i < n; i++) {
            System.out.println("到节点 " + i + " 的距离: " + dist[i]);
        }
    }
}

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

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

相关文章

自动化设备对接MES系统找DeepSeek问方案

项目需要现场的PLC设备HTTP协议JSON格式的方式对接MES系统平台&#xff0c;于是试了一下&#xff1a; 找到的相关资源链接在这里。

李代数(Lie Algebras)与Attention:深度学习中的数学之美

李代数与Attention&#xff1a;深度学习中的数学之美 引言 作为一名深度学习研究者&#xff0c;您一定对Transformer模型和其中的注意力机制&#xff08;Attention&#xff09;不陌生。Attention通过查询&#xff08;Query&#xff09;、键&#xff08;Key&#xff09;和值&a…

OpenCV给图像添加噪声

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 如果你已经有了一张干净的图像&#xff0c;并希望通过编程方式向其添加噪声&#xff0c;可以使用 OpenCV 来实现这一点。以下是一个简单的例子&a…

vscode下载安装教程(附安装包)vscode图文安装教程最新版

文章目录 一、vscode下载二、vscod安装教程1.启动vscode安装程序&#xff1a;2.应对提示&#xff1a;3.接受协议&#xff1a;4.更改vscode安装路径&#xff1a;5.推进安装vscode&#xff1a;6.创建vscode快捷方式&#xff1a;7.开始安装vscode&#xff1a;8.完成vscode安装&…

深度解读 Chinese CLIP 论文:开启中文视觉对比语言预训练

目录 论文概述1.论文摘要2.论文脑图3.论文创新3.1模型构建3.2训练方法3.3数据构建3.4部署优化 4.模型架构 论文解析1. 引言2. 方法2.1数据说明2.2预训练方法2.2.1模型初始化方法2.2.2两阶段预训练方法 2.3预训练细节2.3.1模型初始化2.3.2第一阶段预训练2.3.3第二阶段预训练2.3.…

【开源】低代码 C++程序框架,Linux多线程程序

大家好&#xff0c;欢迎来到停止重构的频道。 本期介绍我们新的C低代码框架&#xff1a;Bees&#xff0c;用于编写Linux/Unix的多线程程序。 低代码框架一般是不会对C程序下手的&#xff0c;因为C程序一般是比较复杂的程序&#xff0c;光是多线程同步就够头疼的了。 但是我们…

重新审视 ChatGPT 和 Elasticsearch:第 2 部分 - UI 保持不变

作者&#xff1a;来自 Elastic Jeff Vestal 本博客在第 1 部分的基础上进行了扩展&#xff0c;介绍了基于 RAG 的搜索系统的功能齐全的 Web UI。最后&#xff0c;你将拥有一个将检索、搜索和生成过程结合在一起的工作界面&#xff0c;同时使事情易于调整和探索。 不想读完整个内…

点云 PCL 滤波在自动驾驶的用途。

1.直通滤波 2.体素滤波、 2.1 分类&#xff1a;VoxelGrid&#xff08;求体素的重心又称质心点&#xff09;和ApproximateVoxelGrid&#xff08;求体素的中心点&#xff09;两种体素滤波器&#xff0c; 2.2 衍生&#xff1a;此外衍生了改进体素滤波&#xff08;求距离重心最近…

人工智能 pytorch篇

pytorch是一个深度学习框架&#xff0c;他封装了张量&#xff08;Tensor&#xff09;&#xff0c;Pytorch中的张量就是元素为同一种数据类型的多维矩阵。在Pytorch中&#xff0c;张量以类的形式封装起来&#xff0c;对张量的一些运算、处理的方法被封装在类中。 pytorch的安装…

Cherno 游戏引擎笔记(91~111)

好久不见&#xff01; 个人库的地址&#xff1a;&#xff08;GitHub - JJJJJJJustin/Nut: The game_engine which learned from Cherno&#xff09;&#xff0c;可以看到我及时更新的结果。 -------------------------------Saving & Loading scene-----------------------…

DeepSeek行业应用实践报告-智灵动力【112页PPT全】

DeepSeek&#xff08;深度搜索&#xff09;近期引发广泛关注并成为众多企业/开发者争相接入的现象&#xff0c;主要源于其在技术突破、市场需求适配性及生态建设等方面的综合优势。以下是关键原因分析&#xff1a; 一、技术核心优势 开源与低成本 DeepSeek基于开源架构&#xf…

项目8:信用违约预测-集成学习

目录 背景说明 项目介绍 导入模块 数据加载 分析与处理数据 划分数据集 使用随机森林创建并训练模型 通过参数搜索和过采样&#xff0c;缓解标签不平衡问题 小结 背景说明 风险已经成为了今年金融市场的重要主题之一&#xff0c;银行作为贷方&#xff0c;随时都面临着借贷者违约…

一文了解:部署 Deepseek 各版本的硬件要求

很多朋友在咨询关于 DeepSeek 模型部署所需硬件资源的需求&#xff0c;最近自己实践了一部分&#xff0c;部分信息是通过各渠道收集整理&#xff0c;so 仅供参考。 言归正转&#xff0c;大家都知道&#xff0c;DeepSeek 模型的性能在很大程度上取决于它运行的硬件。我们先看一下…

Redis分布式锁故障处理:当Redis不可用时的应对策略

Redis分布式锁故障处理&#xff1a;当Redis不可用时的应对策略 在分布式系统中&#xff0c;Redis因其高性能和丰富的特性常被用于实现分布式锁。但当加锁过程中Redis服务不可用时&#xff0c;系统将面临严重挑战。本文将深入探讨这一问题&#xff0c;并提供多维度解决方案。 目…

GO 进行编译时插桩,实现零码注入

Go 编译时插桩 Go 语言的编译时插桩是一种在编译阶段自动注入监控代码的技术&#xff0c;目的是在不修改业务代码的情况下&#xff0c;实现对应用程序的监控和追踪。 基本原理 Go 编译时插桩的核心思想是通过在编译过程中对源代码进行分析和修改&#xff0c;将监控代码注入到…

vue3中ref和reactive响应式数据、ref模板引用(组合式和选项式区别)、组件ref的使用

目录 Ⅰ.ref 1.基本用法&#xff1a;ref响应式数据 2.ref模板引用 3.ref在v-for中的模板引用 ​4.ref在组件上使用 ​5.TS中ref数据标注类型 Ⅱ.reactive 1.基本用法&#xff1a;reactive响应式数据 2.TS中reactive标注类型 Ⅲ.ref和reactive的使用场景和区别 Ⅳ.小结…

计算机毕业设计SpringBoot+Vue.js视频网站系统(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

LVS+Keepalived 高可用集群搭建

一、高可用集群&#xff1a; 1.什么是高可用集群&#xff1a; 高可用集群&#xff08;High Availability Cluster&#xff09;是以减少服务中断时间为目地的服务器集群技术它通过保护用户的业务程序对外不间断提供的服务&#xff0c;把因软件、硬件、人为造成的故障对业务的影响…

macos下myslq图形化工具之Sequel Ace

什么是Sequel Ace 官方github&#xff1a;https://github.com/Sequel-Ace/Sequel-Ace Sequel Ace 是一款快速、易于使用的 Mac 数据库管理应用程序&#xff0c;用于处理 MySQL 和 MariaDB 数据库。 Sequel Ace 是一款开源项目&#xff0c;采用 MIT 许可证。用户可以通过 Ope…

lvgl运行机制分析

lv_timer_handler() 是 LVGL 的“心脏”&#xff1a;这个函数会依次做以下事情&#xff1a; 处理定时器&#xff08;如动画、延迟回调&#xff09;。 读取输入设备&#xff08;如触摸屏、按键的状态&#xff09;。 刷新脏区域&#xff08;仅重绘屏幕上发生变化的区域&#xf…