面试题002-Java-Java集合
面试题002-Java-Java集合
目录
- 面试题002-Java-Java集合
- 题目自测
- 题目答案
- 1. 说说 List,Set,Map 三者的区别?三者底层的数据结构?
- 2. 有哪些集合是线程不安全的?怎么解决呢?
- 3. 比较 HashSet 、LinkedHashSet 和 TreeSet 三者的异同?
- 4. HashMap 和 Hashtable 的区别?HashMap 和 HashSet 区别? HashMap 和 TreeMap 区别?
- 5. HashMap 的底层实现?
- 6. HashMap 的长度为什么是 2 的幂次方?
- 7. ConcurrentHashMap 和 Hashtable 的区别?
- 8. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现?
- 参考资料
题目自测
- 1. 说说 List,Set,Map 三者的区别?三者底层的数据结构?
- 2. 有哪些集合是线程不安全的?怎么解决呢?
- 3. 比较 HashSet 、LinkedHashSet 和 TreeSet 三者的异同?
- 4. HashMap 和 Hashtable 的区别?HashMap 和 HashSet 区别? HashMap 和 TreeMap 区别?
- 5. HashMap 的底层实现?
- 6. HashMap 的长度为什么是 2 的幂次方?
- 7. ConcurrentHashMap 和 Hashtable 的区别?
- 8. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现?
题目答案
1. 说说 List,Set,Map 三者的区别?三者底层的数据结构?
答:List 有序、可以包含重复元素。主要实现类为 ArrayList 底层数据结构为动态数组。
Set 无序,不可以包含重复元素。主要实现类为 HashSet 底层数据结构为哈希表。
Map 存储键值对,键不能重复,值可以重复。主要实现类为 HashMap 底层数据结构为数组+链表/红黑树。
2. 有哪些集合是线程不安全的?怎么解决呢?
答:常见的线程不安全的集合类有 ArrayList,LinkedList,HashSet,TreeSet, HashMap,TreeMap等。
解决办法有:1.使用concurrent包中的并发集合类,如ConcurrentHashMap等。
2.使用Collections类的静态方法返回线程安全的集合。
3.使用synchroniza关键字对需要同步的代码块加锁。
3. 比较 HashSet 、LinkedHashSet 和 TreeSet 三者的异同?
答:相同点是这三个类都实现了Set接口,都提供了集合的基本操作,都是线程不安全的。
HashSet 底层数据结构为哈希表,元素无序。
LinkedHashSet 底层数据结构为链表和哈希表,元素按照插入顺序排序,先进先出。
TreeSet 底层数据结构为红黑树,按照自然排序或者通过Comparator自定义排序。
4. HashMap 和 Hashtable 的区别?HashMap 和 HashSet 区别? HashMap 和 TreeMap 区别?
答:
HashMap 和 Hashtable :
- HashMap 线程不安全。可以存储一个null键,和多个null值。初始容量为16,扩容时容量翻倍。
- Hashtable 线程安全,其中的大部分方法使用synchronized关键字修饰。不可以存储null键和值。初始容量为11,扩容时容量变为原来的2n+1。
HashMap 和 HashSet:
- HashMap 存储键值对,基于哈希表实现。
- HashSet 仅存储不重复的元素,基于HashMap实现。
HashMap 和 TreeMap:
- HashMap 基于哈希表实现,不保证顺序,操作时间复杂度为O(1)。
- TreeMap 基于红黑树实现,按照自然排序或者通过Comparator自定义排序,操作时间复杂度为O(log n)。
5. HashMap 的底层实现?
答:它的底层是基于数组+链表、JDK8之后还包括红黑树来存储键值对。
在存储数据时,使用键的hashCode方法计算哈希值,通过哈希值确定元素在数组中的位置。HashMap会根据数组的占用情况自动的调整容量,当超过阈值时,会进行扩容,大小为原来的两倍,并将旧数组的所有元素重新计算哈值后放入新数组。如果该位置为空就直接插入,否则就检查链表或者红黑树,如果链表中已经存在相同的键,就更新对应的值,如果不存在相同的键,则插入新节点,JDK8以后当链表长度超过阈值8时,就将链表转为红黑树。
6. HashMap 的长度为什么是 2 的幂次方?
答:HashMap的长度为2的幂次方,主要是为了简化索引计算、减少哈希冲突和提高性能。通过位运算代替取模运算,可以更高效地计算数组索引,并确保哈希值的均匀分布。
7. ConcurrentHashMap 和 Hashtable 的区别?
答:两者的区别主要体现在实现线程安全的方式上不同
Hashtable 使用单一锁机制,使用synchronized关键字来实现,适用于低并发场景。
ConcurrentHashMap 采用了一种更复杂的机制,包括CAS操作、分段锁和sychronized相结合的方式来实现线程安全,提供更高的并发性能。
8. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现?
答:在JDK1.7及之前,采用分段锁机制,它通过将整个Map分成多个Segment,每个Segment都有自己的锁,从而允许多线程同时访问不同的Segment。
在JDK8及以后取消了Segment,采用synchronized和CAS操作直接对哈希表中的节点进行操作,通过更加细粒度的锁,保证了高效的并发访问。
参考资料
- JavaGuide
- 牛客网-Java面试宝典
相关文章:
面试题002-Java-Java集合
面试题002-Java-Java集合 目录 面试题002-Java-Java集合题目自测题目答案1. 说说 List,Set,Map 三者的区别?三者底层的数据结构?2. 有哪些集合是线程不安全的?怎么解决呢?3. 比较 HashSet 、LinkedHashSet 和 TreeSet 三者的异同&…...
数组越界情况
数组越界情况...
工作日常学习记录
使用情景 今天开发上遇到一个搜索的需求,要求可以多选,模糊查询。我首先和前端沟通,前端多选后使用逗号分隔,拼成字符串传输给我,我后端再进行具体的处理。 具体处理 初步构想 由于需要查询的字段也是一个长的字符…...
C#中的容器
1、数组 数组是存储相同类型元素的固定大小的顺序集合 声明数组时,必须指定数组的大小 2.数组的插入和删除数据比较麻烦,但是查询比较快 2、动态数组(ArrayList) 动态数组:可自动调节数组的大小 可以存储任意类型数…...
rust + mingw安装教程
0. 说明 windows上安装rust时,需要在电脑上安装C/C构建工具。推荐的的两种工具链可以选择: visual studio build toolsmingw 官方推荐使用visual studio,若你的电脑上已经安装了visual studio,则无需再安装,直接安装…...
【sqlite3】联系人管理系统
SQLite3实现简单的联系人管理系统 有关sqlite3的基础知识请点击:SQLite3的使用 效果展示: 创建一个名为contacts.db的数据库 首先,我们需要创建一个名为contacts.db的数据库,并建立一个名为"contact"的表࿰…...
秋招Java后端开发冲刺——并发篇2(JMM与锁机制)
本文对Java的内存管理模型、volatile关键字和锁机制进行详细阐述,包括synchronized关键字、Lock接口及其实现类ReentrantLock、AQS等的实现原理和常见方法。 一、JMM(Java内存模型) 1. 介绍 JMM定义了共享内存中多线程程序读写操作的行为规…...
记录一次Chrome浏览器自动排序ajax请求的JSON数据问题
文章目录 1.前言2. 为什么会这样?3.如何解决? 1.前言 作者作为新人入职的第一天,mentor给了一个维护公司运营平台的小需求,具体需求是根据运营平台的某个管理模块所展示记录的某些字段对展示记录做排序。 第一步: myb…...
【嵌入式——FreeRTOS】任务
【嵌入式——FreeRTOS】任务 任务创建和删除动态方式创建任务静态方式创建任务 删除任务任务切换调度器任务切换流程 任务挂起任务恢复相关API函数 任务创建和删除 动态方式创建任务 任务的任务控制块以及任务的栈空间所需的内存,均由freeRTOS从freeRTOS管理的堆中…...
网关,路由器,交换机
一、网关 (Gateway) 是一种设备,用于连接不同网络,能够转发数据包并翻译协议,允许不同类型的网络通信。网关通常工作在OSI模型的应用层或传输层,提供连接和路由服务。 应用场景例子: 在企业网络中,网关可…...
sublime 3 背景和字体颜色修改
sublime 4 突然抽风,每次打开都显示 “plugin_host-3.3 has exited unexpectedly, some plugin functionality won’t be available until Sublime Text has been restarted” 一直没调好,所以我退回到sublime 3了。下载好了软件没问题,但是一…...
leetcode 403周赛 包含所有1的最小矩形面积||「暴力」
3197. 包含所有 1 的最小矩形面积 II 题目描述: 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形,并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意…...
Stable Diffusion web UI 插件
2024.7.3更新,持续更新中 如果需要在linux上自己安装sd,参考:stable diffusion linux安装 插件复制到 /stable-diffusion-webui/extensions 目录下,然后重新启动sd即可 一、插件安装方法 每种插件的安装方法可能略有不同…...
深度学习中的反向传播算法的原理
深度学习中的反向传播算法的原理,以及如何计算梯度 反向传播算法(Backpropagation)是深度学习中最核心的优化技术之一,用于训练神经网络。它基于链式法则,通过从输出层逆向计算误差并逐层传递到输入层来更新模型参数&…...
身处奇瑞看三星:既“开卷“又“起火“,却更难受了
三星"起火" 这几天奇瑞的事情,让大家破防了,纷纷表示国内的就业市场环境普遍恶劣。 那我们转个眼,看看海外企业的情况。 最近一周,三星频频登上新闻,颇有"起火"之势。 在刚步入下半年的 7 月 1 日…...
系统架构设计师教程(清华第2版)<第1章 绪论>解读
系统架构设计师教程 第一章 绪论 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.3 如何成…...
Vue + Element UI + JSEncrypt实现简单登录页面
安装依赖 npm install jsencrypt --save局部引入 import JSEncrypt from jsencrypt/bin/jsencrypt;登录页面index.vue <template><div class"loginbody"><div class"logindata"><div class"logintext"><h2>Wel…...
从“关注流”到“时间线”,搜狐给内容加信任价值
文 | 螳螂观察 作者 | 易不二 在近日第十六季搜狐新闻马拉松活动中,搜狐新闻APP的“时间线”功能备受瞩目。不仅开幕式现场竖了一块“左手时间线,右手关注流”的路牌,张朝阳也着重强调了“时间线”产品的互动方式:“关注是基础&…...
vscode的一些使用问题
vscode使用技巧 1、快捷键(1)打开命令面板(2)注释(3)删除行(4)上下移动光标(5)光标回退(6)复制行(7)插入空白行…...
爬虫-网页基础
HTML 基本语法 HTML:Hyper Text Markup Language, 超文本标记语言,是计算机语言的一种,由元素构成。 p元素 <p>Web 真好玩!</p> 由三大部分组成 开始标签:一对尖括号中间包裹这元素名称元素内容&#x…...
MiniCPM-V-2_6 Ubuntu 20.04一键部署教程:从安装到运行
MiniCPM-V-2_6 Ubuntu 20.04一键部署教程:从安装到运行 想试试那个能看懂图片还能跟你聊天的多模态大模型MiniCPM-V-2_6吗?很多朋友在第一步——部署上就被卡住了,不是环境依赖搞不定,就是权限问题报错,折腾半天模型还…...
Qwen3.5-2B入门指南:WebUI中Clear Image按钮对多轮图文对话的影响
Qwen3.5-2B入门指南:WebUI中Clear Image按钮对多轮图文对话的影响 1. 认识Qwen3.5-2B轻量化多模态模型 Qwen3.5-2B是Qwen3.5系列中的轻量级版本,仅有20亿参数规模。这个模型特别适合在资源有限的设备上运行,比如个人电脑、边缘计算设备等。…...
工具调用准确率飙到95%!Qwen-7B解耦微调实战实录(非常详细),大模型调优从入门到精通,收藏这一篇就够了!
用Qwen-7B做Agent,本来信心满满,结果MCP一跑,选工具选不对、参数填得稀巴烂,准确率惨不忍睹,最高也就60%徘徊。 后来我发现:普通LoRA根本救不了复杂工具调用。 真正能救命的,是2026年最火的解…...
Gemma-3-270m多场景落地:政务热线知识库问答、医疗术语解释系统
Gemma-3-270m多场景落地:政务热线知识库问答、医疗术语解释系统 1. 快速上手:部署你的第一个Gemma-3-270m服务 想要快速体验Gemma-3-270m的强大能力?通过Ollama部署只需几个简单步骤。 1.1 环境准备与模型选择 首先确保你已经安装了Ollam…...
用STM32和示波器搞定美的/格力空调红外遥控(附完整C代码)
STM32实战:从示波器捕获到空调红外协议逆向全解析 红外遥控技术看似简单,却蕴含着精妙的时序设计和协议逻辑。作为一名长期混迹于硬件开发领域的工程师,我经常遇到需要逆向控制家电的场景。最近在智能家居项目中,就遇到了需要通过…...
让 AI 听懂业务、直接干活:销售易 NeoAgent 2.0 的三大跃迁
当软件行业仍在争论“AI是否会杀死SaaS”时,销售易已经给出了自己的答案。3月27日,在2026腾讯云城市峰会首站上海站,腾讯旗下CRM销售易正式发布新一代营销服全场景AI原生CRM——NeoAgent 2.0。这并非一次简单的产品迭代,而是销售易…...
Linux内核container_of宏解析与应用
1. 理解container_of宏的核心作用在Linux内核开发中,container_of宏是一个极其重要且频繁使用的工具。它的核心功能是通过结构体成员的地址反推出整个结构体的起始地址。想象一下,你手里只有一张照片的某个局部,却能准确找到这张照片在相册中…...
日期时间格式化中的字母代码解析与应用实例
1. 日期时间格式化字母代码入门指南 第一次接触日期时间格式化时,看到那些神秘的字母组合是不是一头雾水?yy、MM、dd这些看起来简单的代码,在实际使用中却藏着不少门道。作为处理时间数据的基础技能,掌握这些字母代码的含义和用法…...
Go语言中的Interface:面向接口编程
Go语言中的Interface:面向接口编程 1. Interface的基本概念 Interface是Go语言中用于定义行为的一种类型,它指定了一组方法签名,但不提供具体实现。Interface是Go语言实现多态和解耦的核心机制,也是面向接口编程的基础。 Go语言的…...
数字创世神:用漏洞规律操控现实
在古老的神话中,数字“一”象征着万物的起源与开端,是混沌初开、宇宙诞生的起点。伏羲一画开天,划分乾坤,自此有了天地与秩序。这种从无到有、从一到多的创世过程,与当今数字世界的构建有着惊人的同构性。在由代码构筑…...
