java·数据结构·hashMap
2020-12-13 03:10
阅读:508
标签:执行 int htable stat 根据 为什么 变量 float 比较
特点
- 线程不安全
- HashMap、和Hashtable、SynchronizedMap区别:
- HashMap 线程不安全,可以有null的key值或value值。
- hashtable 线程安全,不能有null的key值或value值。
- ConcurrentHashMap 线程安全,不能有null的key值或value值。删除操作比较费时。
- SynchronizedMap 线程安全,可以有null的key值或value值。
- 可以通过
Collections.synchronizedMap(new HashMap
方式创建())
- 可以通过
- 性能:HashMap>ConcurrentHashMap>SynchronizedMap>Hashtable
构造方法
相关参数
- initialCapacity:初始最大容量,默认1
- loadFactor:加载因子(默认容量=初始最大容量*加载因子),默认0.75
- threshold:默认容量,内部变量,根据initialCapacity生成。执行构造方法时,将输入的initialCapacity转为不小于当前数的最小的2^k的值,作为threshold。在第一次构建table时(第一次put,执行resize()方法),table的大小设置为threshold,然后让threshold = thresholdloadFactor;后续每一次resize,都是table的大小 = table的大小 2;threshold = threshold * 2;
- 默认关系:threshold = initialCapacity * loadFactor(达到最大容量时不满足该等式)
平衡与折衷
- 加载因子:hash表中元素的填满程度,加载因子越大,空间利用率越高,冲突机会越高(查询成本越高)
代码解析
- public HashMap(int initialCapacity, float loadFactor)
public HashMap(int initialCapacity, float loadFactor) {
/**初始最大容量为非负整数*/
if (initialCapacity MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
/**
* 加载因子为大于0的浮点数
* public static boolean isNaN(float v) {
* return (v != v);
* }
* Float.isNaN(loadFactor):NaN(not-a-number),例如. float v = 0.0f/0.0f;
*/
if (loadFactor 32,65->128
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n = MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
- public HashMap(int initialCapacity)
public HashMap(int initialCapacity) {
this(initialCapacity, DEFAULT_LOAD_FACTOR);
}
- public HashMap()
/**
* 在resize()方法中设置threshold的值
* newCap = DEFAULT_INITIAL_CAPACITY;
* newThr = (int)(DEFAULT_LOAD_FACTOR * DEFAULT_INITIAL_CAPACITY);
*/
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
- public HashMap(Map extends K, ? extends V> m)
- 待梳理
public HashMap(Map extends K, ? extends V> m) { this.loadFactor = DEFAULT_LOAD_FACTOR; putMapEntries(m, false); }
小结:
- java位运算相关知识待归纳。 (位运算的目的是提高效率)
- 1
- double和float区别待归纳。
- HashMap、treemap、treenodes关系
- 为什么n初始化构造map时,转换输入的初始最大容量为2^k,赋值给threshold作为实际最大容量。
java·数据结构·hashMap
标签:执行 int htable stat 根据 为什么 变量 float 比较
原文地址:https://www.cnblogs.com/kunlingou/p/11067857.html
文章来自:搜素材网的编程语言模块,转载请注明文章出处。
文章标题:java·数据结构·hashMap
文章链接:http://soscw.com/index.php/essay/27130.html
文章标题:java·数据结构·hashMap
文章链接:http://soscw.com/index.php/essay/27130.html
评论
亲,登录后才可以留言!