1.HashMap和Hashtable的区别
1)HashMap非线程安全,Hashtable线程安全,因为内部方法都经过synchronized修饰。 2)HashMap可以null Key和null Value,Hashtable不允许。 3)HashMap默认初始化大小为16,之后每次扩充,容量变为原来的2倍;Hashtable默认为11,之后每次扩充,容量变为原来的2n+1;如果创建时给了初始容量,Hashtable直接使用给定大小,HashMap扩充为2的幂次方大小 4)底层数据结构:jdk 1.8之后的HashMap当链表长度大于阈值,将链表转化为红黑树,以减少搜索时间。 5)哈希函数的实现
2.HashMap和HashSet的区别
3.HashMap和TreeMap的区别
TreeMap和HashMap都继承自AbstractMap,但是TreeMap还实现了NavigableMap接口和SortedMap接口,实现NavigableMap接口让TreeMap有了对集合内元素的搜索的能力。 综上,相比于HashMap来说,TreeMap主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。
4.HashMap的底层实现
1)JDK1.8之前:数组和链表 2)JDK1.8之后:红黑树
5.ConcurrentHashMap底层结构
- Java 7 使用分段锁,将哈希表分成多个段,每个段有独立的锁。
- Java 8 引入了细粒度锁,使用桶级锁和树化机制来提高并发性能,采用了无锁读操作和 CAS 操作来优化性能。
6.synchronized 底层原理了解吗?
synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。
synchronized 修饰的方法并没有 monitorenter 指令和 monitorexit 指令,取得代之的确实是 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法。
不过两者的本质都是对对象监视器 monitor 的获取。
7.jvm内存区域、垃圾回收、jvm栈和堆的区别
1)内存区域两张图jdk1.8之前&之后
2)
| 垃圾回收器 | 算法 | 关注点 | |
|---|---|---|---|
| Serial收集器 | 新生代标记-复制;老年代标记-整理 | ||
| ParNew收集器 | 新生代标记-复制;老年代标记-整理 | ||
| Parallel Scavenge 收集器 | 新生代标记-复制;老年代标记-整理 | 吞吐量 | |
| Serial Old 收集器 | |||
| Parallel Old 收集器 | 多线程和“标记-整理” | 吞吐量 | |
| CMS收集器 | “标记-清除”算法 | 停顿时间 | |
| G1 收集器 | “标记-复制”算法 | 吞吐量、停顿时间 | |
| ZGC 收集器 | “标记-复制”算法 | 停顿时间 |
3)
-
栈:
- 存储局部变量和方法调用的上下文信息。
- 自动分配和释放。
- 每个线程有自己的栈,线程间不共享。
- 生命周期短,内存管理简单。
-
堆:
- 存储Java中的对象实例和数组。
- 由垃圾回收器自动管理内存。
- 线程间共享。
- 生命周期长,内存管理复杂。