【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的区别
特点 | Collection | Collections |
---|---|---|
类型 | 接口 | 工具类(类) |
功能 | 定义集合的基本操作,如添加、删除、查询等 | 提供静态方法来操作集合,如排序、查找、同步等 |
用法 | 用作集合的父接口,具体集合类实现该接口 | 用于对集合进行操作,不能实例化 |
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 实现细粒度锁,适合高并发环境。
- HashTable:实现方式与HashMap类似,但是在方法上加上
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中的线程安全的集合是什么?Collections和Collection的区别 Listjava中list的几种实现把ArrayList变成线程安全的有哪些方法?CopyOnWriteArrayList是如何保证线程安全的? Mapj…...
springCloud-2021.0.9 之 GateWay 示例
文章目录 前言springCloud-2021.0.9 之 GateWay 示例1. GateWay 官网2. GateWay 三个关键名称3. GateWay 工作原理的高级概述4. 示例4.1. POM4.2. 启动类4.3. 过滤器4.4. 配置 5. 启动/测试 前言 如果您觉得有用的话,记得给博主点个赞,评论,收…...
公然上线传销项目,Web3 的底线已经被无限突破
作者:Techub 热点速递 撰文:Yangz,Techub News 今天早些时候,OKX 将上线 PI 的消息在圈内引起轩然大波,对于上线被板上钉钉为传销盘子的「项目」 ,Techub News 联系了 OKX 公关,但对方拒绝置评…...
SQL数据清理:去除字段值中的多余符号(Demo例子)
目录 前言1. 基础2. 进阶 前言 Excel中有大量不合法的符号,导入到系统之后,数据库有很多脏数据,对此下述展开sql的清洗教程 在数据库的文本字段中,可能会存在多余的逗号或符号,如,销售,, 或 二手车,销售,,这种情况 希…...
MongoDB 的使用场景
一、内容管理系统 1. 博客平台 文章内容、作者信息、标签、评论等数据结构多样,MongoDB 的无模式特性可轻松应对。比如 WordPress 等博客系统,使用 MongoDB 能灵活存储不同格式和长度的文章内容,以及与文章相关的各种元数据。 2. 新闻网站…...
STM32 RTC 实时时钟说明
目录 背景 RTC(实时时钟)和后备寄存器 32.768HZ 如何产生1S定时 RTC配置程序 第一次上电RTC配置 第1步、启用备用寄存器外设时钟和PWR外设时钟 第2步、使能RTC和备份寄存器访问 第3步、备份寄存器初始化 第4步、开启LSE 第5步、等待LSE启动后稳定状态 第6步、配置LSE为…...
微服务SpringCloud Alibaba组件nacos教程【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】
一.Nacos教程 文章目录 一.Nacos教程1.1 Nacos简介1.2 nacos基本使用直接下载打包服务源码方式启动 1.3 创建nacos客服端1.4 nacos集群配置1.5 nacos配置中心 1.1 Nacos简介 nacos是spring cloud alibaba生态中非常重要的一个组件,它有两个作用: 1:注册…...
深度整理总结MySQL——Expalin指南(二)
Expalin指南(二 前言Extrano tables usedImpossible whereNo matching min/max rowUsing indexUsing index conditionUsing whereUsing join buffer (Block Nested Loop)Not existsUsing intersect(...)、Using union(...)和Using sort_union(...)Zero limitUsing filesortUsin…...
【机器学习】常见采样方法详解
在机器学习领域,数据采样(Sampling)是一项至关重要的技术。它不仅影响模型的训练效率,还直接关系到模型的性能与泛化能力。本文将从基础概念出发,逐步深入介绍机器学习中常见的采样方法,帮助读者全面理解并…...
Kubernetes 最佳实践:Top 10 常见 DevOps/SRE 面试问题及答案
1. 如何在 Kubernetes 中设置资源请求和限制? 资源请求确保容器有最小资源量(CPU/内存),而限制则强制容器消耗的最大资源量。这有助于高效资源分配并防止资源争用。 示例: resources:requests:memory: "256Mi&…...
Python自动化办公之Excel拆分
在日常办公中,我们经常需要将包含多个Sheet页的Excel文件拆分成多个独立的Excel文件。例如,当我们要把一份Excel表格发给各部门确认时,出于控制信息知悉范围、确保数据保密性等方面的考虑,每个部门仅需查看和确认与自己部门对应的…...
Mac上搭建宝塔环境并部署PHP项目
安装Docker Desktop》搭建Centos版本的宝塔环境》部署PHP项目 1. 下载Docker for mac 软件:https://www.docker.com/ 或使用终端命令:brew install --cask --appdir/Applications docker 2. 使用命令安装宝塔环境的centos7系统: docker pul…...
qt 控件的焦点事件
在 Qt 中,设置焦点策略是通过 QWidget 的 setFocusPolicy() 方法来实现的。焦点策略控制了一个控件何时和如何获取焦点。Qt 提供了几种常见的焦点策略,以帮助管理控件的焦点行为。 常见的焦点策略 Qt::NoFocus:控件不接受焦点。Qt::TabFocus&…...
深度学习_学习笔记
pandas Pandas 是一个强大的数据分析库,它封装和集成了多个其他库的功能,以便为用户提供更加便捷的数据处理能力。 pandas与csv 都可用于处理csv文件(注意csv文件不是excel文件) csv 是 Python 标准库的一部分,适合…...
如何在 Elasticsearch 中设置向量搜索 - 第二部分
作者:来自 Elastic Valentin Crettaz 了解如何在 Elasticsearch 中设置向量搜索并执行 k-NN 搜索。 本文是三篇系列文章中的第二篇,深入探讨了向量搜索(也称为语义搜索)的复杂性以及它在 Elasticsearch 中的实现方式。 第一部分重…...
leetcode 面试经典 150 题:跳跃游戏 II
链接跳跃游戏 II题序号45题型数组题解贪心算法难度中等熟练度✅✅✅ 题目 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums…...
C++20 新特性解析
1. 概念(Concepts) 概念是 C++20 引入的一项重要特性,它允许程序员定义类型约束,从而在编译时检查模板参数是否符合某些要求。概念提供了模板参数的限制,使得模板代码更加可读和易于维护。 示例代码: #include <iostream> #include <concepts>// 定义一个…...
vue不是内部或外部命令?
问题:当我们在使用脚手架创建项目之前,执行了npm i vue/cli -g或yarn global add vue/cli之后,再执行vue --version无法执行,vue不是内部或外部命令。 前几天在学vue时也是遇到了这个问题,现在来分享一下解决方法。 …...
C#中的Frm_Welcome.Instance.Show(),是什么意思
Frm_Welcome.Instance.Show() 是一种常见的单例模式(Singleton Pattern)实现方式,通常用于在应用程序中确保某个窗体(Form)只有一个实例,并通过该实例显示窗体。以下是对这段代码的详细解释: 代…...
k8s优雅操作pod容器组
k8s优雅操作pod容器组 回退备份 kubectl get deploy deployName -o yaml>>deployName-bak-date "%Y-%m-%d".yaml获取副本数 replicasecho | kubectl get -o template deploy/deployName --template{{.spec.replicas}}停止容器组 kubectl scale deployment …...
【LeetCode: 1760. 袋子里最少数目的球 + 二分】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
动态规划LeetCode-416.分割等和子集
给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…...
kotlin-kapt
kotlin-kapt kotlin-kapt 是 Kotlin 的一个插件,专门用于处理注解处理器(Annotation Processor)。以下是对该插件的详细解释和指南: kotlin-kapt 是什么? kotlin-kapt 是 Kotlin 官方提供的一个插件,用于在…...
网络安全技术复习总结
1|0第一章 概论 1.网络安全发展阶段包括四个阶段:通信安全、计算机安全、网络安全、网络空间安全。 2.2017年6月1日,我国第一部全面规范网络空间安全的基础性法律《中华人民共和国网络安全法》正式实施。 3.2021年 6月10日,《中华人民共和…...
java 集合
Java集合框架(Java Collections Framework)是一个强大的工具库,旨在简化数据存储和操作的任务。它提供了一组接口、类和算法,帮助开发者高效地管理数据,如列表、集合和映射。下面是Java集合框架的详细介绍:…...
Java常见排序算法及代码实现
1、选择排序算法 选择排序(Selection Sort)是一种简单直观的排序算法,它的工作原理是每次从未排序部分选择最小(或最大)的元素,将其放到已排序部分的末尾。 2、冒泡排序算法 冒泡排序(Bubble…...
130,[1] 攻防世界 very_easy_sql
进入靶场 典型SQL注入页面 先查看源码 访问 试试http://127.0.0.1/ 还尝试了其他都是nonono 回归第一个登录页面 提交的内容不在url处显示,反而第二个url页面会在url处显示 明白第一个页面是通过post方式提交,反正没得到什么信息,去抓…...
Spring Boot从入门到精通:核心知识点+实战指南
目录 一、Spring Boot 是什么?为什么它如此流行? 二、快速创建你的第一个Spring Boot应用 2.1 使用Spring Initializr生成项目 2.2 核心代码示例 三、深度解析Spring Boot核心机制 3.1 自动配置原理揭秘 3.2 自定义Starter实战 四、生产环境必备…...
深入探索现代CSS:从基础到未来趋势
引言:CSS的进化之路 CSS(层叠样式表)自1996年诞生以来,已从简单的样式描述语言发展为构建现代Web体验的核心技术。截至2023年,超过98%的网站使用CSS3技术,其发展历程见证了Web从静态文档到富交互应用的蜕变…...
python-leetcode 23.反转链表
题目: 给单链表的头节点,反转链表,并返回反转后的链表。 方法一:迭代 在遍历链表时,将当前节点的next指针改为指向前一个节点。由于节点没有引用其前一个节点,因此要先存储前一个节点,在更改引…...
Foundation CSS 可见性
Foundation CSS 可见性 引言 在网页设计中,CSS可见性是一个至关重要的概念。它决定了元素在网页上是否可见,以及如何显示。Foundation CSS 是一个流行的前端框架,它提供了丰富的工具和组件来帮助开发者构建响应式和可访问的网页。本文将深入探讨 Foundation CSS 中的可见性…...
DeepSeek模拟阿里面试——java基本语法
为了全面准备阿里Java高级程序员的面试,以下是针对数据类型和变量、运算符、流程控制的系统性复习和准备策略: 数据类型和变量 基本数据类型 整数类型:byte(1字节)、short(2字节)、int…...
大模型基本原理(二)——ChatGPT的工作原理
如何得到一个ChatGPT? 1、无监督预训练:通过大量的文本数据集进行无监督训练,得到一个基座模型(只会续写文本) 2、监督微调:通过一些人类撰写的高质量对话数据对基座模型进行监督微调,得到一个…...
TensorRT 8.6.1教程1-TensorRT简介
区分计算节点和数据节点 视频 TensorRT 教程 | 基于 8.6.1 版本 | 第一部分_哔哩哔哩_bilibili cookbook...
Seaweedfs(master volume filer) docker run参数帮助文档
文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下,这个-volume.minFreeSpace string有点狠,比如设置值为10(10%),它直接给系统只留下10%的空间࿰…...
深度求索(DeepSeek)的AI革命:NLP、CV与智能应用的技术跃迁
Deepseek官网:DeepSeek 引言:AI技术浪潮中的深度求索 近年来,人工智能技术以指数级速度重塑全球产业格局。在这场技术革命中,深度求索(DeepSeek)凭借其前沿的算法研究、高效的工程化能力以及对垂直场景的…...
探索RDMA技术:从基础到实践
1. 引言 在当今的高性能计算(HPC)和数据中心领域,数据传输的效率和速度至关重要。RDMA(Remote Direct Memory Access,远程直接内存访问)技术作为一种高效的网络通信机制,能够显著减少数据传输的延迟和CPU负载。本文将从基础到实践,详细介绍RDMA技术及其编程模型,帮助…...
Excel 笔记
实际问题记录 VBA脚本实现特殊的行转列 已知:位于同一Excel工作簿文件中的两个工作表:Sheet1、Sheet2。 问题:现要将Sheet2中的每一行,按Sheet1中的样子进行转置: Sheet2中每一行的黄色单元格,为列头。…...
Flutter编译运行android问题之JVM版本问题
错误1: FAILURE: Build failed with an exception. * What went wrong: Execution failed for task :audioplayers_android:compileDebugKotlin. > Inconsistent JVM-target compatibility detected for tasks compileDebugJavaWithJavac (1.8) and compileDebug…...
自动化遇到的问题记录(遇到问题就更)
总结回归下自己这边遇到的一些问题 “EOF错误”,获取不到csv里面的内容 跑多csv文件里的场景,部分场景的请求值为 1、检查csv文件里不能直接是[]开头的参数,把[]改到ms平台的请求参数里 2、有时可能是某个参数值缺了双引号的其中一边 met…...
解决 Flutter Device Daemon 启动失败问题的实践记录
解决 Flutter Device Daemon 启动失败问题的实践记录 最近在使用 Flutter 开发时踩了一个坑。看似是个小问题,但折腾了好久,最终通过日志分析和查阅资料才找到了解决办法。这里记录一下整个问题的排查过程,希望能帮助到遇到类似问题的小伙伴…...
中国通信企业协会 通信网络安全服务能力评定 证书使用说明
中国通信企业协会颁发的通信网络安全服务能力资格证书,是证明证书持有单位符合通信网络安全服务相应能力准则要求。证书持有单位在使用中国通信企业协会颁发的证书时,应遵守以下规定: 评定证书 证书持有单位必须遵守《中国通信企业协会通信网…...
《我在技术交流群算命》(三):QML的Button为什么有个蓝框去不掉啊(QtQuick.Controls由Qt5升级到Qt6的异常)
有群友抛出类似以下代码和运行效果截图: import QtQuick import QtQuick.ControlsWindow {width: 640height: 480visible: truetitle: qsTr("Hello World")Button{anchors.centerIn: parentwidth: 100height: 40background: Rectangle {color: "red…...
多项式插值(数值计算方法)Matlab实现
多项式插值(数值计算方法)Matlab实现 一. 原理介绍二. 程序设计1. 构建矩阵2. 求解矩阵方程3. 作出多项式函数4. 绘制插值曲线5. 完整代码 三. 图例 一. 原理介绍 关于插值的定义及基本原理可以参照如下索引 插值原理(数值计算方法ÿ…...
【AIGC】语言模型的发展历程:从统计方法到大规模预训练模型的演化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯语言模型的发展历程:从统计方法到大规模预训练模型的演化1 统计语言模型(Statistical Language Model, SLM):统…...
[python]如何安装whl包并解决依赖关系(详细)
一、什么是whl文件? whl是一种预编译的二进制包文件,它主要用于安装python库。简单来讲whl就是一种已经编译好的python库文件。我们可以使用whl包来安装python库。 二、我们为什么需要使用whl文件来安装python库? 有的小伙伴可能会疑惑&…...
Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行
文章目录 Windows中使用Docker安装Anythingllm,基于deepseek构建自己的知识库问答大模型1. 安装 Docker Desktop2. 使用Docker拉取Anythingllm镜像2. 设置 STORAGE_LOCATION 路径3. 创建存储目录和 .env 文件.env 文件的作用关键配置项 4. 运行 Docker 命令docker r…...
用Kibana实现Elasticsearch索引的增删改查:实战指南
在大数据时代,Elasticsearch(简称 ES)和 Kibana 作为强大的数据搜索与可视化工具,受到了众多开发者的青睐。Kibana 提供了一个直观的界面,可以方便地对 Elasticsearch 中的数据进行操作。本文将详细介绍如何使用 Kiban…...
AI前端开发的国际化发展机遇:ScriptEcho助力全球化布局
在全球化的今天,互联网应用已不再局限于单一市场。高效便捷的前端开发方案成为企业拓展国际市场的关键。得益于人工智能技术的飞速发展,AI代码生成器 正在深刻改变前端开发模式,为国际化应用开发带来前所未有的机遇。然而,国际化开…...
本地基于GGUF部署的DeepSeek实现轻量级调优之一:提示工程(Prompt Engineering)(完整详细教程)
前文,我们在本地windows电脑基于GGUF文件,部署了DeepSeek-1.5B模型,如果想自行对模型进行训练,离线模式下加载本地的DeepSeek模型进行训练时,是不能直接使用GGUF文件进行训练。 请参照我的文章在本地部署好模型之后再继…...