HashMap

概要

在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的键值对会被放在同一个位桶里,
当桶中元素较多时,通过key值查找的效率较低。

在极端情况下可能会存在某个链表很长,整个时候整个查找效率就变低了,于是有了1.8的改进方式。使用红黑树,提升查询效率。

而JDK1.8中,HashMap采用位桶+链表+红黑树实现,如果哈希表单向链表中元素超过8个,那么单向链表这种数据结构会变成红黑树数据结构。
当红黑树上的节点数量小于6个,会重新把红黑树变成单向链表数据结构。

数组

存储区间是连续,且占用内存严重,空间复杂也很大,时间复杂为O(1)。

Read More

ConcurrentHashMap

ConcurrentHashMap 是一个并发散列映射表的实现,它允许完全并发的读取,并且支持给定数量的并发更新。
相比于 HashTable 和用同步包装器包装的HashMap(Collections.synchronizedMap(new HashMap())),ConcurrentHashMap 拥有更高的并发性。
在 HashTable 和由同步包装器包装的 HashMap 中,使用一个全局的锁来同步不同线程间的并发访问。同一时间点,只能有一个线程持有锁,
也就是说在同一时间点,只能有一个线程能访问容器。这虽然保证多线程间的安全并发访问,但同时也导致对容器的访问变成串行化的了。
在使用锁来协调多线程间并发访问的模式下,减小对锁的竞争可以有效提高并发性。有两种方式可以减小对锁的竞争: 减小请求同一个锁的频率。
减少持有锁的时间。 ConcurrentHashMap 的高并发性主要来自于三个方面:

  1. 用分离锁实现多个线程间的更深层次的共享访问。
  2. 用HashEntery对象的不变性来降低执行读操作的线程在遍历链表期间对加锁的求。
  3. 通过对同一个 volatile 变量的写 / 读访问,协调不同线程间读 / 写操作的内存可见性。 使用分离锁,减小了请求同一个锁的频率。
Read More

反射

反射(Reflection)的作用:

  • 反射让开发人员可以通过外部类的全路径名创建对象,并使用这些类,实现一些扩展的功能。
  • 反射让开发人员可以枚举出类的全部成员,包括构造函数、属性、方法。以帮助开发者写出正确的代码。
  • 测试时可以利用反射API访问类的私有成员,以保证测试代码覆盖率。
Read More