面试 Java 基础八股文十问十答第二十期
作者:程序员小白条,个人博客
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)HashMap 和 ConcurrentHashMap 的区别
- 线程安全性:HashMap 是非线程安全的,而 ConcurrentHashMap 是线程安全的。
- 锁机制:HashMap 使用的是悲观锁机制,即在对 HashMap 进行写操作时需要对整个 HashMap 进行加锁;而 ConcurrentHashMap 使用的是分段锁机制,将整个 HashMap 分成多个段,每个段都有自己的锁,不同的线程可以同时操作不同的段,从而提高并发性能。
- 性能:在高并发的情况下,ConcurrentHashMap 的性能比 HashMap 更好,因为它支持并发读写操作,减少了线程竞争的情况。
2)ConcurrentHashMap 和 Hashtable 的区别?
- 线程安全性:ConcurrentHashMap 是线程安全的,而 Hashtable 也是线程安全的。
- 锁机制:ConcurrentHashMap 使用的是分段锁机制,而 Hashtable 使用的是同一把锁,即对整个 Hashtable 进行加锁,导致并发性能较差。
- Null 值:ConcurrentHashMap 允许键和值都为 null,而 Hashtable 不允许键和值为 null。
- 迭代器:ConcurrentHashMap 的迭代器是弱一致性的,而 Hashtable 的迭代器是强一致性的。
3)ConcurrentHashMap 底层具体实现知道吗?实现原理是什么?
- ConcurrentHashMap 的底层数据结构是数组和链表/红黑树的组合,数组的每个元素称为一个桶,每个桶存储一个链表或红黑树,用于解决哈希冲突。
- ConcurrentHashMap 使用了分段锁机制,将整个数组划分为多个段,每个段都有自己的锁。当进行读写操作时,只需要锁定对应的段,而不需要锁定整个 ConcurrentHashMap,从而提高并发性能。
- 在读取操作时,不需要加锁,可以并发地进行;在写入操作时,只需要锁定对应的段,而不需要锁定其他段,从而减少了线程竞争的情况。
- 在 JDK 8 及以上版本,ConcurrentHashMap 进一步引入了红黑树来优化链表,提高查找的效率,从而进一步提升并发性能。
4)Array 和 ArrayList 有何区别?
- 数据类型:Array 可以存储基本数据类型和对象,而 ArrayList 只能存储对象。
- 大小可变性:Array 的大小是固定的,一旦创建后不能改变;而 ArrayList 的大小是可变的,可以动态添加或删除元素。
- 内存占用:Array 在创建时需要指定大小,会占用一定的内存空间;而 ArrayList 可以根据需要动态调整大小,节省内存空间。
- 随机访问效率:Array 可以通过索引直接访问元素,速度较快;而 ArrayList 需要通过遍历来查找元素,速度较慢。
5)comparable 和 comparator的区别?
- 接口类型:Comparable 是一个接口,需要实现 Comparable 接口并重写 compareTo 方法;而 Comparator 是一个接口,需要实现 Comparator 接口并重写 compare 方法。
- 排序方式:Comparable 是内部排序方式,即在对象自身内部实现比较逻辑;而 Comparator 是外部排序方式,即通过外部的比较器来进行排序。
- 对象类型:Comparable 用于对象自身的默认排序,需要在对象类中实现 Comparable 接口;而 Comparator 可以用于对不同类的对象进行排序,需要通过实现 Comparator 接口来自定义比较逻辑。
- 使用场景:Comparable 适用于对对象自身进行排序的情况,比如对数字、字符串等对象进行排序;而 Comparator 适用于需要自定义排序规则的情况,比如对对象的某个属性进行排序。
6)Collection 和 Collections 有什么区别?
- 类型:Collection 是一个接口,定义了一组集合操作的方法;而 Collections 是一个工具类,提供了一些静态方法来操作集合对象。
- 功能:Collection 定义了集合的基本操作,比如添加、删除、遍历等;而 Collections 提供了一些静态方法,用于对集合进行排序、查找、替换等操作。
- 集合类型:Collection 是一个接口,有多个实现类,比如 List、Set、Queue 等;而 Collections 是一个工具类,可以操作任意类型的集合对象。
- 使用方式:Collection 是一个接口,需要通过实现类来创建对象;而 Collections 是一个工具类,直接调用其中的静态方法即可。
7)TreeMap 和 TreeSet 在排序时如何比较元素? Collections 工具类中的 sort()方法如何比较元素?
- TreeMap 和 TreeSet 使用的是元素的自然顺序或者通过传入的 Comparator 对象来比较元素。在 TreeMap 中,元素需要实现 Comparable 接口或者通过构造方法传入的 Comparator 对象来进行比较。在 TreeSet 中,元素需要实现 Comparable 接口或者通过构造方法传入的 Comparator 对象来进行比较。
- Collections 工具类中的 sort() 方法使用的是元素的自然顺序或者通过传入的 Comparator 对象来比较元素。在 sort() 方法中,元素需要实现 Comparable 接口或者通过传入的 Comparator 对象来进行比较。
8)CopyOnWriteArrayList 底层原理是什么?
CopyOnWriteArrayList 是一种线程安全的 List 实现,它的底层原理是在写操作时创建一个新的数组,并将原始数组的内容复制到新数组中,然后将新元素添加到新数组中。这样可以避免写操作对读操作的影响,读操作可以在不加锁的情况下并发进行。因为每次写操作都会创建一个新的数组,所以 CopyOnWriteArrayList 的写操作会比较耗费内存和时间,适用于读操作频繁、写操作较少的场景。
9)ConcurrentMarkSweepException 是怎么发生的?
ConcurrentMarkSweepException 是指在进行 Java 堆的垃圾回收时,发生了 Concurrent Mark Sweep (CMS) 垃圾回收器的异常。这种异常通常是由于堆内存不足或者垃圾回收器无法及时回收垃圾导致的。
10)怎么解决 ConcurrentMarkSweepException 的问题?
- 增加堆内存大小,通过调整 JVM 的堆内存参数(如 -Xmx 和 -Xms)来增加堆内存的大小,从而减少发生内存不足的可能性。
- 优化代码,减少内存的使用量,比如及时释放不再使用的对象,避免内存泄漏等。
- 调整垃圾回收器的参数,比如调整 CMS 回收器的线程数、回收阈值等,以提高垃圾回收的效率。
- 使用其他垃圾回收器,如 G1 垃圾回收器,它在并发标记和清理阶段采用了不同的算法,可以更好地处理大堆和高并发的情况。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 900+ Star,1.5W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐