当前位置: 首页 > article >正文

【Java八股文】02-Java集合面试篇

【Java八股文】02-Java集合面试篇

  • 概念
    • 数组与集合区别
    • 常用集合
    • Java中的线程安全的集合是什么?
    • Collections和Collection的区别
  • List
    • java中list的几种实现
    • 把ArrayList变成线程安全的有哪些方法?
    • CopyOnWriteArrayList是如何保证线程安全的?
  • Map
    • java中常见map
    • HashMap实现原理介绍一下?
    • 解决Hash冲突的办法
    • hashmap key可以为null吗?
    • 重写HashMap的equal和hashcode方法需要注意什么?
    • ConcurrentHashMap用了悲观锁还是乐观锁?
  • Set
    • 有序的set


概念

数组与集合区别

  • 数组是定长的,集合是动态的
  • 数组是可以包含基本数据类型和对象的,而集合只能包含对象
  • 数组是可以直接通过下标进行访问元素的,而集合需要通过迭代器等进行访问。

常用集合

  • ArrayList:动态数组,add(E e)

  • LinkedList:双向链表,add(E e)

  • HashMap:哈希map,put(K, V)

  • HashSet:哈希set,add(E e)

  • ArrayDeque:双向队列

    • 栈:使用 push() 入栈,pop() 出栈,peek() 查看栈顶
    • 队列:使用 offer() 入队尾,poll() 出队头,offerFirst 入队头,pollLast 出队尾

Java中的线程安全的集合是什么?

常用的:

  • CopyOnWriteArrayList:读操作无锁,写操作复制新数组,适用于读多写少的场景,如配置管理、黑名单等。写代价高,add每次都会创建新数组。

  • ConcurrentHashMap:与 HashTable (也是线程安全的,表级别锁)的主要区别是二者加锁粒度的不同,支持行锁,适合高并发读写。

  • ConcurrentLinkedQueue:基于 CAS(无锁队列),高效且支持高并发。适用于生产者-消费者模型(如任务队列)。

Collections和Collection的区别

特点CollectionCollections
类型接口工具类(类)
功能定义集合的基本操作,如添加、删除、查询等提供静态方法来操作集合,如排序、查找、同步等
用法用作集合的父接口,具体集合类实现该接口用于对集合进行操作,不能实例化

List

java中list的几种实现

  • 线程不安全:
    • ArrayList:基于动态数据实现,支持随机访问,初始容量为10,满了会扩容是扩容50%
    • LinkedList:基于双向链表实现,不需要初始容量
  • 线程安全:
    • Vector:基于动态数组实现,加上了synchronized关键字,初始容量为10,满了会扩容是扩容1倍。
    • CopyOnWriteArrayList:读操作无锁,写操作复制新数组,适用于读多写少的场景。

把ArrayList变成线程安全的有哪些方法?

  • 使用Collections.synchronizedXxx()(包装同步集合),该方法对普通集合进行同步包装,使其线程安全,但在迭代时仍需手动同步。该方法只对集合的操作进行保护,并为队迭代操作及逆行自动加锁,所以迭代荣然需要显式的同步。

    List<String> list = Collections.synchronizedList(new ArrayList<>());
    synchronized (list) { //多线程访问for (String s : list) {System.out.println(s);}
    }
    
  • 使用CopyOnWriteArrayList或Vector类代替ArrayList

CopyOnWriteArrayList是如何保证线程安全的?

  • 读操作没有锁,因为在每次写操作前都会生成一个快照,读操作读的都是快照。
  • 写操作,使用volatile关键字修饰数组,保证顺序和可见性,并且每次写入时都加锁并且会复制整个数组,并将修改后的新数组设置为当前数组。

Map

java中常见map

  • 线程不安全:
    • HashMap:基于数组+链表+红黑树实现,支持随机访问,初始容量为16,扩容因子0.75,达到额定容量75%会进行,扩容是扩容一倍。
  • 线程安全:
    • HashTable:实现方式与HashMap类似,但是在方法上加上synchronized保证线程安全,同一时刻只能有一个线程访问HashTable的方法,但是锁是表级锁。
    • ConcurrentHashMap:通过分段锁和 CAS 实现细粒度锁,适合高并发环境。

HashMap实现原理介绍一下?

在JDK8之前的HashMap实现中,HashMap使用哈希算法将键(key)映射到数组中的索引位置。如果两个或多个键的哈希值相同,即发生了哈希冲突,HashMap会通过链表解决冲突:将新加入的元素以链表的形式存储在对应的索引位置,成为该位置的链表头节点(链表的第一个元素)。

JDK8之后,如果链表长度超过8就转为红黑树保存,小于6时原转为链表。

解决Hash冲突的办法

  • 链表法
  • 开放地址:在数组内找个新的地方放:线性探测(+1)、二次探测(+12+22+3^2)、双重哈希(使用第二个哈希函数)
  • 再哈希:当负载因子超过某个阈值重新计算哈希表的大小。

hashmap key可以为null吗?

可以为null,如果为null,那其哈希值直接为0。

重写HashMap的equal和hashcode方法需要注意什么?

  • equals()hashCode() 必须保持一致性:相等的对象 equals() 返回 true,则它们的 hashCode() 必须相同。

  • 实现 hashCode() 时要确保散列值均匀,避免大量冲突。

ConcurrentHashMap用了悲观锁还是乐观锁?

首先CAS是乐观锁,synchronized 是悲观锁。

  • 乐观锁的基本思想是:假设多个线程不会发生冲突,因此在操作数据时,不会立即加锁,而是先进行尝试。如果出现冲突,才进行修正。CAS 是一种硬件支持的机制(通过 CPU 指令实现),它通过比较内存中的值与预期值是否相等,如果相等,就更新值,否则就不做任何操作,返回失败。它是无锁的,因此不会像传统的锁那样造成线程阻塞。

  • 悲观锁的基本思想是:假设多个线程一定会发生冲突,因此在访问共享资源时会采取 加锁 的方式,保证同一时刻只有一个线程可以访问该资源。

ConcurrentHashMap 是一种高效的线程安全的 Map实现,它结合了乐观锁和悲观锁的思想,但总体上可以认为它采用的是分段锁(Segment Lock)和乐观锁结合的方式。具体来说,它在不同的操作中使用了不同的锁策略,来优化并发性能。

  • JDK8之前是分段锁+synchronized悲观锁。

  • JDK8之后ConcurrentHashMap 改进了实现,采用了CAS(乐观锁)与轻量级锁相结合的方式:

    • 读操作不加锁:对于 get 操作,它不加锁,采用乐观锁(通过 CAS)来保证线程安全。
    • 写操作会使用 CAS 尝试更新数据。如果没有发生冲突,CAS 会直接更新值,不需要加锁,这也是一种乐观锁。如果 CAS 失败(即发生竞争),ConcurrentHashMap 会采用 悲观锁(例如使用 ReentrantLock)来保护更新操作,以保证线程安全。这是因为在竞争激烈的情况下,使用悲观锁能够确保写操作的正确性,避免数据不一致。
    • 扩容是会用悲观锁来同步该过程。

Set

map和set插入时都是先用hashCode来判断位置,set使用equals来判断set中集合是否存在值相同的元素,如果存在则不会插入。

有序的set

  • TreeSet是基于红黑树实现
  • LinkedHashSet是基于双重链表和哈希表的结合来实现元素的有序存储

相关文章:

【Java八股文】02-Java集合面试篇

【Java八股文】02-Java集合面试篇 概念数组与集合区别常用集合Java中的线程安全的集合是什么&#xff1f;Collections和Collection的区别 Listjava中list的几种实现把ArrayList变成线程安全的有哪些方法&#xff1f;CopyOnWriteArrayList是如何保证线程安全的&#xff1f; Mapj…...

稀土抑烟剂——为汽车火灾安全增添防线

一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素&#xff08;如稀土氧化物和稀土金属化合物&#xff09;开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能&#xff0c;减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性&#xff0c;…...

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题&#xff0c;今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中&#xff0c;单服同时在线一般都会有几千人。当有个玩家执行一个操作&#xff0c;理想情况下要把玩家的操作广播同步给单…...

Python中的HTTP客户端库:httpx与request | python小知识

Python中的HTTP客户端库&#xff1a;httpx与request | python小知识 在Python中&#xff0c;发送HTTP请求和处理响应是网络编程的基础。requests和httpx是两个常用的HTTP库&#xff0c;它们都提供了简洁易用的API来发送HTTP请求。然而&#xff0c;httpx作为新一代的HTTP客户端…...

ASP.NET Core SignalR的分布式部署

假设聊天室程序被部署在两台服务器上&#xff0c;客户端1、2连接到了服务器A上的ChatRoomHub&#xff0c;客户端3、4连接到服务器B上的ChatRoomHub&#xff0c;那么客户端1发送群聊消息时&#xff0c;只有客户端1、2能够收到&#xff0c;客户端3、4收不到&#xff1b;在客户端3…...

【Elasticsearch】match查询

Elasticsearch 的match查询是全文搜索中最常用和最强大的查询类型之一。它允许用户在指定字段中搜索文本、数字、日期或布尔值&#xff0c;并提供了丰富的功能来控制搜索行为和结果。以下是match查询的详细解析&#xff0c;包括其工作原理、参数配置和使用场景。 1.match查询的…...

AndroidStudio中可用的Ai插件

GitHub Copilot 这是我目前主用的&#xff0c;还行 1. 安装 打开 Android Studio&#xff1a;启动您的 Android Studio。 导航到插件设置&#xff1a; 点击菜单栏中的 File&#xff08;文件&#xff09; > Settings&#xff08;设置&#xff09;。在设置窗口中&#xff0…...

【C】链表算法题7 -- 环形链表||

leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到…...

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射&#xff08;特殊的存储器&#xff09;2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…...

Android Studio:EditText常见4种监听方式

1. 文本变化监听&#xff08;TextWatcher&#xff09; TextWatcher 主要用于监听 EditText 里的文本变化&#xff0c;它有三个方法&#xff1a; beforeTextChanged&#xff08;文本变化前&#xff09;onTextChanged&#xff08;文本正在变化时&#xff09;afterTextChanged&a…...

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵&#xff0c;具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…...

机器学习(李宏毅)——BERT

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 读这篇文章必须先了解self-attention、Transformer&#xff0c;可参阅我其他文章。 二、大纲 BERT简介self-…...

数据科学之数据管理|统计学

使用python学习统计 目录 01 统计学基础 7 一、 统计学介绍 7 二、 数据和变量 8 02 描述统计 10 一、 描述统计概述 10 二、 分类变量的描述 11 三、 等距数值变量的描述 13 四、 等比数值变量的描述 16 五、 常用软件包介绍 16 六、 数值变量的描述统计 18 (一)…...

深度学习-111-大语言模型LLM之基于langchain的结构化输出功能实现文本分类

文章目录 1 langchain的结构化输出1.1 推荐的使用流程1.2 模式定义1.3 返回结构化输出1.3.1 工具调用(方式一)1.3.2 JSON模式(方式二)1.3.3 结构化输出法(方式三)2 文本分类2.1 定义分类模式2.2 配置分类提示模板2.3 初始化分类模型2.4 分类示例3 参考附录1 langchain的结构化输…...

常见的排序算法:插入排序、选择排序、冒泡排序、快速排序

1、插入排序 步骤&#xff1a; 1.从第一个元素开始&#xff0c;该元素可以认为已经被排序 2.取下一个元素tem&#xff0c;从已排序的元素序列从后往前扫描 3.如果该元素大于tem&#xff0c;则将该元素移到下一位 4.重复步骤3&#xff0c;直到找到已排序元素中小于等于tem的元素…...

C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现

文章目录 一、std::gcd 的基本用法&#xff08;一&#xff09;包含头文件&#xff08;二&#xff09;函数签名&#xff08;三&#xff09;使用示例 二、std::gcd 的实现原理三、std::gcd 的优势&#xff08;一&#xff09;简洁易用&#xff08;二&#xff09;类型安全&#xff…...

力扣刷题(数组篇)

日期类 #pragma once#include <iostream> #include <assert.h> using namespace std;class Date { public:// 构造会频繁调用&#xff0c;所以直接放在类里面&#xff08;类里面的成员函数默认为内联&#xff09;Date(int year 1, int month 1, int day 1)//构…...

OpenWRT中常说的LuCI是什么——LuCI介绍(一)

我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西&#xff0c;但luci到底是什么东西&#xff0c;可能还不够清楚&#xff0c;今天就趁机来介绍下&#xff0c;openwrt中的luci&#xff0c;到底是个什么东西。 什么是LuCI&#xff1f; 首先&#xff0c;LuCI是OpenWRT中…...

机器学习核心算法解析

机器学习核心算法解析 机器学习是人工智能的核心技术之一&#xff0c;它通过从数据中学习模式并做出预测或决策。本文将深入解析机器学习的核心算法&#xff0c;包括监督学习、无监督学习和强化学习&#xff0c;并通过具体案例和代码示例帮助读者理解这些算法的实际应用。 1. …...

【目标检测json2txt】label从COCO格式json文件转YOLO格式txt文件

目录 🍀🍀1.COCO格式json文件 🌷🌷2.YOLO格式txt文件 💖💖3.xml2json代码(python) 🐸🐸4.输入输出展示 🙋🙋4.1输入json 🍂🍂4.2输出txt 整理不易,欢迎一键三连!!! 送你们一条美丽的--分割线-- 🍀🍀1.COCO格式json文件 COCO数…...

LVDS接口总结--(5)IDELAY3仿真

仿真参考资料如下&#xff1a; https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …...

Flink内存配置和优化

在 Apache Flink 1.18 的 Standalone 集群中&#xff0c;内存设置是一个关键配置&#xff0c;它直接影响集群的性能和稳定性。 Flink 的内存配置主要包括 JobManager 和 TaskManager 的内存分配。 以下是如何在 Standalone 模式下配置内存的详细说明。 JobManager 内存配置 Jo…...

网络安全之笔记--Linus命令

Linux命令 文件和目录操作 ls 列出目录内容 常用选项 -a&#xff1a;显示所有文件和目录&#xff08;包括隐藏文件&#xff0c;以.开头的文件&#xff09;。 -l&#xff1a;以长格式显示文件和目录的详细信息。 -h&#xff1a;与-l配合使用&#xff0c;以更易读的方式显示文件大…...

deepseek和chatgpt对比

DeepSeek 和 ChatGPT 都是自然语言处理领域的工具&#xff0c;但它们的设计目标和功能有所不同。 功能定位&#xff1a; ChatGPT 是一个基于 OpenAI GPT-3 或 GPT-4 的聊天机器人&#xff0c;旨在进行人机对话、文本生成、问题解答等&#xff0c;广泛应用于教育、客服、创意写作…...

微服务与网关

什么是网关 背景 单体项目中,前端只用访问指定的一个端口8080,就可以得到任何想要的数据 微服务项目中,ip是不断变化的,端口是多个的 解决方案:网关 网关:就是网络的关口,负责请求的路由、转发、身份校验。 前段还是访问之前的端口8080即可 后端对于前端来说是透明的 网…...

Unity中实现动态图集算法

在 Unity 中&#xff0c;动态图集&#xff08;Dynamic Atlas&#xff09;是一种在运行时将多个纹理合并成一个大纹理图集的技术&#xff0c;这样可以减少渲染时的纹理切换次数&#xff0c;提高渲染效率。 实现原理&#xff1a; 动态图集的核心思想是在运行时动态地将多个小纹理…...

本地部署DeepSeek Nodejs版

目录 1.下载 Ollama 2.下载DeepSeek模型 3.下载 ollama.js 1.下载 Ollama https://ollama.com/ 下载之后点击安装&#xff0c;等待安装成功后&#xff0c;打开cmd窗口&#xff0c;输入以下指令&#xff1a; ollama -v 如果显示了版本号&#xff0c;则代表已经下载成功了。…...

字节跳动后端二面

&#x1f4cd;1. 数据库的事务性质&#xff0c;InnoDB是如何实现的&#xff1f; 数据库事务具有ACID特性&#xff0c;即原子性、一致性、隔离性和持久性。InnoDB通过以下机制实现这些特性&#xff1a; &#x1f680; 实现细节&#xff1a; 原子性&#xff1a;通过undo log实…...

TUSB422 MCU 软件用户指南

文章目录 TUSB422 MCU 软件用户指南 目录表格图表1. 介绍2. 配置2.1 通用配置2.2 USB-PD 3.0 支持2.3 VDM 支持 3. 代码 ROM/RAM 大小优化4. 通过 UART 调试4. 移植到其他微控制器 TUSB422 MCU 软件用户指南 摘要 本文档是 TUSB422 微控制器基于 Type-C 端口控制&#xff08;…...

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹&#xff0c;作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时&#xff0c;django-admin.exe安装的位置&#xff0c;例如 4.运行命令 使用django-admin.exe的绝对路径&#xff0c;在刚才打开的终端…...