HashMap(1)
来源:互联网 发布:淘宝考试女士内衣 编辑:程序博客网 时间:2024/06/13 20:16
http://www.cnblogs.com/skywang12345/p/3310835.html
1.(1)HashMap实例受两个参数影响,初始容量和加载因子(桶数默认16和满的程度0.75)
(2)非线程安全的
2.哈希表是由数组+链表组成的,长度为16的数组,每个元素存链表的表头节点。每个bucket可以通过hash(key)%len获
得。Hashmap其实也是一种线性的数组实现的。
HashMap有个静态内部类Entry(key,value,next) 实现了Map.Entry<K,V>接口,Entry包含一对键值和next指针,所以HashMap可以看成是Entry[]数组。(下图来自他人)
HashMap内部字段:table(Entry[]数组),size(int),threshold(int容量*加载因子),loadFactor(float加载因子),modCount(int 实现fail-fast机制)
Entry内部字段:next(Entry),hash(int),key,value
static class Entry<K,V> implements Map.Entry<K,V> { final K key; V value; // 指向下一个节点 Entry<K,V> next; final int hash; // 构造函数。 // 输入参数包括"哈希值(h)", "键(k)", "值(v)", "下一节点(n)" Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } public final K getKey() { return key; } public final V getValue() { return value; } public final V setValue(V newValue) { V oldValue = value; value = newValue; return oldValue; } // 判断两个Entry是否相等 // 若两个Entry的“key”和“value”都相等,则返回true。 // 否则,返回false public final boolean equals(Object o) { if (!(o instanceof Map.Entry)) return false; Map.Entry e = (Map.Entry)o; Object k1 = getKey(); Object k2 = e.getKey(); if (k1 == k2 || (k1 != null && k1.equals(k2))) { Object v1 = getValue(); Object v2 = e.getValue(); if (v1 == v2 || (v1 != null && v1.equals(v2))) return true; } return false; } // 实现hashCode() public final int hashCode() { return (key==null ? 0 : key.hashCode()) ^ (value==null ? 0 : value.hashCode()); } public final String toString() { return getKey() + "=" + getValue(); } // 当向HashMap中添加元素时,绘调用recordAccess()。 // 这里不做任何处理 void recordAccess(HashMap<K,V> m) { } // 当从HashMap中删除元素时,绘调用recordRemoval()。 // 这里不做任何处理 void recordRemoval(HashMap<K,V> m) { }}静态内部类Entry就是一个单链表,所以HashMap采用拉链法避免冲突的。
3.HashMap在存储事采用了处余法
// 存储时:
int hash = key.hashCode(); // hashCode方法,每个key的hash是一个固定的int值
int index = hash % Entry[].length;
Entry[index] = value;
// 取值时:
int hash = key.hashCode();
int index = hash % Entry[].length;
return Entry[index];
}
而是 >= initialCapacity的2的n次幂!!!!
当哈希表的容量超过默认容量时,必须调整table的大小。当容量已经达到最大可能值时,那么该方法就将容量调整到Integer.MAX_VALUE返回,这时,需要创建一张新表,将原表的映射到新表中。
}
}
- HashMap(1)
- (1)HashMap源码解析
- HashMap源码分析(1)
- HashMap 源码解析(1)
- JDK8 源码之HashMap(1)
- 1、HashMap排序
- 1、HashMap与HashTable
- 深入了解HashMap(1)
- HashMap源码学习1
- HashMap理解1
- HashMap使用 (一)
- HashMap 使用 (二)
- (2)HashMap面试
- HashMap原理(一)
- HashMap原理(二)
- HashMap原理(二)
- HashMap(原理三)
- HashMap 面试(转载)
- Restful风格API接口开发springMVC篇
- iMindMap8在安装时出现1018错误怎么解决
- iOS中assign,copy,retain之间的区别以及weak和strong的区别
- 出现滚动条之后如何修复内部DOM宽度
- 假spaly害人-洛谷P1486 郁闷的出纳员
- HashMap(1)
- 不懂互联网,找app外包公司做app可行吗?
- APP被拒绝上架的各种原因翻译
- odoo postgres备份与恢复数据库
- C#委托使用详解
- 使用MATLAB加载训练好的caffe模型进行识别分类
- 关于python中常用基本概念的总结
- java图片压缩
- TensorFlow 像梵高一样作画