1、什么是反射机制?
JAVA 反射机制是在运行状态中, 对于任意一个类, 都能够知道这个类的所有属性和方法; 对于任意一个对象, 都能够调用它的任意一个方法和属性; 这种动态获取的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。
2、concurrenthashmap 的解析
ConcurrentHashMap 是 Java 中线程安全的 Map 实现, 它允许多个线程同时对 Map 进行读写操作,而不会导致数据不一致或者其他线程安全问题。 它的主要特点包括:
1. 分段锁设计: ConcurrentHashMap 将整个 Map 分为多个 segment, 每个 segment 都维护着一个独立的哈希表。 在读写时, 只需要锁定对应的 segment, 不需要锁定整个 Map, 从而提高了并发度。
2. 基于 CAS 操作的并发控制: ConcurrentHashMap 的 put()、 get()、 remove()等操作都是通过CAS( Compare and Swap) 实现的。 在 put()操作中, 如果两个线程同时插入了同一个 key, 只有一个线程的操作会成功, 另一个线程的操作会失败, 从而保证了数据的正确性。
3. 支持高并发读操作: ConcurrentHashMap 的读操作不需要锁定 Map, 多个线程可以同时对 Map进行读操作, 不会出现并发安全问题。
4. 空间动态调整: ConcurrentHashMap 支持动态扩容和收缩, 可以根据当前 Map 中的数据量自动调整容量。总之, ConcurrentHashMap 通过分段锁设计和基于 CAS 操作的并发控制等技术手段, 实现了高并发下的安全读写操作, 并且具有较好的扩展性和空间利用率。 但需要注意的是, ConcurrentHashMap并不保证 Map 中的数据是按照插入顺序或者其他顺序排列的, 因此不适合用于有序数据的存储和查询。
3、Hashmap 原理, 为什么要红黑树而不是二叉树
HashMap 是 Java 中常用的 Map 实现, 它基于哈希表实现, 可以快速地插入、 删除和查找数据。
HashMap 的主要原理如下:
1. 存储结构: HashMap 内部使用数组来存储键值对, 每个键值对对应数组中的一个元素。 当插入一个键值对时, 会根据 key 的哈希值计算出对应的数组下标, 然后将键值对存储在该位置。
2. 解决哈希冲突: 由于不同的 key 可能计算出相同的哈希值, 所以在插入过程中可能会出现哈希冲突。 HashMap 通过链表法解决哈希冲突, 即将冲突的键值对以链表的形式存储在同一数组位置上。 当查找一个键值对时, 会先根据 key 的哈希值计算出对应的数组下标, 然后遍历该位置上的链表, 直到找到对应的键值对或者遍历完整个链表。
3. 优化红黑树: 在 JDK1.8 中, 当某个数组位置上的链表长度超过了阈值(默认为 8) , HashMap会将链表转化为红黑树, 以提高查找效率。 红黑树相对于普通的二叉树,