HashMap深度分析.docVIP

  • 0
  • 0
  • 约8.78千字
  • 约 7页
  • 2017-02-09 发布于重庆
  • 举报
HashMap深度分析

java.util.HashMap是很常见的类,前段时间公司系统由于对HashMap使用不当,导致cpu百分之百,在并发环境下使用HashMap 而没有做同步,可能会引起死循环,关于这一点,sun的官方网站上已有阐述,这并非是bug。 HashMap的数据结构 ???????? HashMap主要是用数组来存储数据的,我们都知道它会对key进行哈希运算,哈系运算会有重复的哈希值,对于哈希值的冲突,HashMap采用链表来解决的。在HashMap里有这样的一句属性声明: transient Entry[] table; Entry就是HashMap存储数据所用的类,它拥有的属性如下 final K key; V value; final int hash; EntryK,V next; 看到next了吗?next就是为了哈希冲突而存在的。比如通过哈希运算,一个新元素应该在数组的第10个位置,但是第10个位置已经有Entry,那么好吧,将新加的元素也放到第10个位置,将第10个位置的原有Entry赋值给当前新加的 Entry的next属性。数组存储的是链表,链表是为了解决哈希冲突的,这一点要注意。 几个关键的属性 存储数据的数组 transient Entry[] table; 这个上面已经讲到了 默认容量 static final int DEFAULT_INITIAL_CAPACITY = 16; 最大容量 static final int MAXIMUM_CAPACITY = 1 30; 默认加载因子,加载因子是一个比例,当HashMap的数据大小=容量*加载因子时,HashMap会将容量扩容 static final float DEFAULT_LOAD_FACTOR = 0.75f; 当实际数据大小超过threshold时,HashMap会将容量扩容,threshold=容量*加载因子 int threshold; 加载因子 final float loadFactor; HashMap的初始过程 构造函数1 ??? public HashMap(int initialCapacity, float loadFactor) { ??????? if (initialCapacity 0) ??????????? throw new IllegalArgumentException(Illegal initial capacity: + ?????????????????????????????????????????????? initialCapacity); ??????? if (initialCapacity MAXIMUM_CAPACITY) ??????????? initialCapacity = MAXIMUM_CAPACITY; ??????? if (loadFactor = 0 || Float.isNaN(loadFactor)) ??????????? throw new IllegalArgumentException(Illegal load factor: + ?????????????????????????????????????????????? loadFactor); ??????? // Find a power of 2 = initialCapacity ??????? int capacity = 1; ??????? while (capacity initialCapacity) ??????????? capacity = 1; ?? ??????? this.loadFactor = loadFactor; ??????? threshold = (int)(capacity * loadFactor); ??????? table = new Entry[capacity]; ??????? init(); ??? } 重点注意这里 while (capacity initialCapacity) ??????????? capacity = 1; capacity才是初始容量,而不是initialCapacity,这个要特别注意,如果执行new HashMap(9,0.75);那么HashMap的初始容量是16,而不是9,想想为什么吧。 构造函数2 public HashMap(int initialCapacity) { ??????? this(initialCapacity, DEFAULT_LOAD_FACTOR); ??? } 构造函数3,全部都是默认值 ?? public HashMap() { ??????? t

文档评论(0)

1亿VIP精品文档

相关文档