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

java八股!1

集合

目录

    • 集合
      • java中存在哪些集合?底层实现逻辑?
      • 哪些集合是线程安全的?
      • 集合的对比:
      • hash冲突如何解决
      • hashmap为什么线程不安全,如何实现安全?
      • hashmap中循环链表的产生
      • hashmap底层实现原理和扩容机制
      • map的遍历方式

java中存在哪些集合?底层实现逻辑?

哪些集合是线程安全的?

hashtable(不常用,低并发下性能较差,因为put和get操作都需要同步),concurrenthashmap,基于分段锁实现,将数据结构分段,不同线程可以同时对不同段读写,提高并发度。

集合的对比:

一律从底层实现(数组,动态数组,双向链表,红黑树),线程安全(vector,hashtable,concurrenthashmap是线程安全的),迭代方式,元素类型(基本元素or对象,可否存null,是否重复,是键值对还是单一元素),
hashmap与hashtable
hashmap与hashset(map存储键值对,set存储单一键值,set可以放一个null,map的key和value都可为null,性能方面由于set只存值,性能相比map较好)
arraylist与linkedlist
arraylist与arraydeque
hashmap与concurrenthashmap区别(线程安全,concurrent通过分段锁实现,高并发和低并发下二者有不同性能,hashmap在并发下只能通过外部同步的方法实现同步,collections.synchronizedmap()方法。。以及迭代时是否需要加锁)

hash冲突如何解决

先说明hash冲突的发生原因,hash表的实现是由数据经过hash函数运算得到的位置进行存储,但hash表的位置是有限的,计算的数据是无限的,总会出现不同组数据经过计算得到相同hash值的情况,就叫hash冲突。
解决方法:
开放寻址:根据冲突后的地址向前寻找一个空闲的位置进行存储

链式寻址:把存在hash冲突的位置按单向链表的形式存储

再hash法:再使用另一个hash函数对这个key进行运算,直到不再发生冲突。此方法会对性能有影响,可能会增加计算时间。

建立公共溢出区:把hash表分为基本表和溢出表,有冲突的值一律放到溢出表的部分

hashmap为什么线程不安全,如何实现安全?

并发修改,可能一个线程进行写操作,另一个线程读操作的时候可能会读取到不一致的数据导致抛出异常。
操作不是原子的,比如查找某个key是否存在的操作,多个线程可能会产生竞态条件。

实现安全,通过collections.concurrentsynchronizedMap(),创建一个线程安全的hashmap,使put和get操作实现同步
或使用concurrentHashmap
或显示地使用锁

hashmap中循环链表的产生

jdk1.7中是使用头插法给table扩容的,在多线程的情况下容易导致线程1还在处理节点,线程2已经逆序扩好容了,此时会产生循环链表的情况

hashmap底层实现原理和扩容机制

哈希表里的每个元素都是一个node类(基于map.entry的实现),node对象包含key,value,hash值,next节点存储下一个节点位置,所以只需要记录每个hash的第一个node就可以遍历到整个map中的node

map的遍历方式

forEach+getkey()/values()一次性取出所有key或者value遍历
forEach+entrySet,将键值对存入set遍历
使用interator+entrySet()结合,优点是每一步循环都可控,循环过程中可以改变集合的长度(forEach循环中不可以改变)
使用stream流+lambda表达式

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 非网站业务怎么接入高防IP抗DDoS
  • 《数字信号处理》学习06-因果系统与稳定系统
  • 风语者:CG-23超声波风速风向传感器,与自然对话的桥梁
  • 【触想智能】工业一体机在物流领域上的四大应用分析
  • C语言调用两个lib中的同名函数
  • React 组件间共享数据
  • 【lc_hot100】刷题心得
  • 2024网络安全学习路线,最全保姆级教程,学完直接拿捏!
  • LabVIEW中Request Deallocation 功能
  • 关于汽车加油是加200还是加满的思考
  • 小红书商品详情API:引领电商新时代,精细把控商品呈现革新
  • 我用 GPT 学占星
  • Vue 的常用指令以及相关修饰符的含义
  • Shell 编程入门
  • WPF中创建横向的ListView
  • 【笔记】你不知道的JS读书笔记——Promise
  • 10个最佳ES6特性 ES7与ES8的特性
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android 控件背景颜色处理
  • Electron入门介绍
  • javascript数组去重/查找/插入/删除
  • MQ框架的比较
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • ReactNativeweexDeviceOne对比
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spring核心 Bean的高级装配
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (三)终结任务
  • (四)c52学习之旅-流水LED灯
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (五)MySQL的备份及恢复
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .“空心村”成因分析及解决对策122344
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .Net Core和.Net Standard直观理解
  • .net FrameWork简介,数组,枚举
  • .NET单元测试
  • @RequestBody与@ModelAttribute
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • [.net]官方水晶报表的使用以演示下载
  • [AIGC codze] Kafka 的 rebalance 机制
  • [android] 练习PopupWindow实现对话框