JAVA 八股
1.1JAVA基础面试1.2JAVA 集合面试1.2.1 HashMap 和 Hashtable区别、联系与实战解析共同点底层数据结构核心二者底层都基于「数组 链表」JDK 1.8 后 HashMap 新增红黑树优化实现哈希表。通过key.hashCode()计算哈希值确定元素在数组中的位置哈希冲突时用链表或红黑树存储冲突元素。核心功能都实现了Map接口支持「增删改查」键值对操作put/get/remove等键的要求键都不能重复重复 put 会覆盖原值键的hashCode()和equals()方法会影响哈希表的正确性需遵循重写规则。核心区别维度HashMapHashtable线程安全非线程安全性能高线程安全性能低底层实现JDK 1.8 引入红黑树链表长度≥8 时转换始终是数组 链表无红黑树优化null 支持允许 key/value 为 null仅 1 个 null key不允许 key/value 为 null抛 NullPointerException继承体系继承AbstractMap实现Map接口继承Dictionary实现Map接口初始容量 / 扩容初始容量 16扩容为 2 倍16→32→64初始容量 11扩容为 2 倍 111→23→47哈希算法优化过的哈希算法减少冲突直接使用key.hashCode()冲突率较高遍历方式支持快速失败fail-fast的迭代器支持快速失败的枚举Enumeration 迭代器默认加载因子0.75和 Hashtable 一致0.75使用场景单线程环境绝大部分业务场景多线程环境已被 ConcurrentHashMap 替代为什么 Hashtable 被淘汰Hashtable 的线程安全是通过「给整个方法加synchronized」实现的相当于 “整个哈希表一把锁”线程 A 操作索引 0 的元素线程 B 操作索引 100 的元素也会被阻塞ConcurrentHashMap 采用「分段锁JDK 1.7/ CAS 局部锁JDK 1.8」只锁冲突的桶并发性能提升 10 倍以上。1.2.2 为什么ArrayList不是线程安全的具体来说是哪里不安全在高并发添加数据下ArrayList会暴露三个问题部分值为null我们并没有add null进去索引越界异常size与我们add的数量不符public boolean add(E e) { ensureCapacityInternal(size 1)// Increments modCount!! elementData[size]e; return true; }大体可以分为三步判断数组需不需要扩容如果需要的话调用grow方法进行扩容将数组的size位置设置值因为数组的下标是从o开始的将当前集合的大小加1下面我们来分析三种情况都是如何产生的部分值为null当线程1走到了扩容那里发现当前size是9而数组容量是10所以不用扩容这时候cpu让出执行权线程2也进来了发现size是9而数组容量是10所以不用扩容这时候线程1继续执行将数组下标索引为9的位置set值了还没有来得及执行size这时候线程2也来执行了又把数组下标索引为9的位置set了一遍这时候两个先后进行size导致下标索引l10的地方就为null了。索引越界异常线程1走到扩容那里发现当前size是9数组容量是10不用扩容cpu让出执行权线程2也发现不用扩容这时候数组的容量就是10而线程1set完之后size这时候线程2再进来size就是10数组的大小只有10而你要设置下标索引为10的就会越界数组的下标索引从0开始size与我们add的数量不符这个基本上每次都会发生这个理解起来也很简单因为size本身就不是原子操作可以分为三步获取size的值将size的值加1将新的size值覆盖掉原来的线程1和线程2拿到一样的size值加完了同时覆盖就会导致一次没有加上所以肯定不会与我们add的数量保持一致的;1.2.3 什么是CASCAS 是「比较并交换」Compare And Swap的缩写是无锁并发编程的核心技术也是ConcurrentHashMap、AtomicInteger等并发工具的底层实现。它解决了传统加锁synchronized导致的性能问题用硬件级别的原子操作保证并发安全。核心定义CAS 是一种原子指令由 CPU 硬件层面保证原子性它的逻辑可以概括为我认为变量的当前值是 A只有当实际值确实是 A 时才把它改成 B如果实际值不是 A说明被其他线程改了就什么都不做返回 “失败”。CAS vs synchronized核心对比维度CASsynchronized锁类型无锁自旋独占锁阻塞原子性保证CPU 硬件指令JVM 层面的锁机制性能高无上下文切换低高并发下阻塞 / 唤醒开销适用场景单个变量的高频读写多变量 / 复杂逻辑的并发控制问题ABA、自旋开销死锁、线程阻塞1.3 JAVA并发
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416714.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!