锁定老帖子 主题:三顾java.util.HashMap
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2011-04-11
第四点
文档上的说明不好用吗? Map m = Collections.synchronizedMap(new HashMap(...)); 这样的一个HashMap线程不安全? 表示完全没试过。。。仅存理论啊 |
|
返回顶楼 | |
发表时间:2011-04-11
s929498110 写道 LZ
HashMap容器重新装载的方法, 你修改的不正确 比如第一个key的哈希值是1234 第二个key的哈希值是12345 可能旧的容器的 table.length比较小, indexOf返回的值是一样的 而新的容器的table.length比较大, indexOf的返回值可能不一样! 也就是容器扩充之后, 原来挂载点相同的Entry,新的挂载点可能不同 你感觉我说的对不? 赞同! |
|
返回顶楼 | |
发表时间:2011-04-11
s929498110 写道 第三点
我感觉装载因子好像不推荐修改吧? 如果一次性容量扩充比较大的话 可以自己设定扩充倍数数量级的 但是说实话。装载因子的使用经验几乎为零。。。现在读大二,实战经验也没多少。就不发表意见了。。。 如何自己设定扩充数量级? |
|
返回顶楼 | |
发表时间:2011-04-11
贾懂凯 写道 s929498110 写道 第三点
我感觉装载因子好像不推荐修改吧? 如果一次性容量扩充比较大的话 可以自己设定扩充倍数数量级的 但是说实话。装载因子的使用经验几乎为零。。。现在读大二,实战经验也没多少。就不发表意见了。。。 如何自己设定扩充数量级? 下面的是我在HashMap中见到的方法, 这个方法应该可以将原来为 2^n 的容量扩充为 2^m 的容量吧? 说实话。。。没试过。。。 void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return; } Entry[] newTable = new Entry[newCapacity]; transfer(newTable); table = newTable; threshold = (int) (newCapacity * loadFactor); } 话说, 我们系有一个女生叫贾轶凯,名字挺像的 |
|
返回顶楼 | |
发表时间:2011-04-11
贾懂凯 写道 s929498110 写道 第三点
我感觉装载因子好像不推荐修改吧? 如果一次性容量扩充比较大的话 可以自己设定扩充倍数数量级的 但是说实话。装载因子的使用经验几乎为零。。。现在读大二,实战经验也没多少。就不发表意见了。。。 如何自己设定扩充数量级? 下面的是我在HashMap中见到的方法, 这个方法应该可以将原来为 2^n 的容量扩充为 2^m 的容量吧? 说实话。。。没试过。。。 void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return; } Entry[] newTable = new Entry[newCapacity]; transfer(newTable); table = newTable; threshold = (int) (newCapacity * loadFactor); } 话说, 我们系有一个女生叫贾轶凯,名字挺像的 |
|
返回顶楼 | |
发表时间:2011-04-12
晕。。。 网络一卡
放了两遍。。。 零点了, 睡觉! 明天还得早起去实验室干活呢! |
|
返回顶楼 | |
发表时间:2011-04-12
s929498110 写道 第四点
文档上的说明不好用吗? Map m = Collections.synchronizedMap(new HashMap(...)); 这样的一个HashMap线程不安全? 表示完全没试过。。。仅存理论啊 得到SynchronizedMap的实例,这个类作为Collection内部类。你是否选用这种方法来处理同步问题,那就看你的选择了。 |
|
返回顶楼 | |
发表时间:2011-04-12
s929498110 写道 贾懂凯 写道 s929498110 写道 第三点
我感觉装载因子好像不推荐修改吧? 如果一次性容量扩充比较大的话 可以自己设定扩充倍数数量级的 但是说实话。装载因子的使用经验几乎为零。。。现在读大二,实战经验也没多少。就不发表意见了。。。 如何自己设定扩充数量级? 下面的是我在HashMap中见到的方法, 这个方法应该可以将原来为 2^n 的容量扩充为 2^m 的容量吧? 说实话。。。没试过。。。 void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE; return; } Entry[] newTable = new Entry[newCapacity]; transfer(newTable); table = newTable; threshold = (int) (newCapacity * loadFactor); } 话说, 我们系有一个女生叫贾轶凯,名字挺像的 容量扩充的倍数在方法addEntry里面写死了: if (size++ >= threshold) resize(2 * table.length); 为2 |
|
返回顶楼 | |
发表时间:2011-04-12
s929498110 写道 我最近也在看Collection的源码
卡在HashMap这里两天了。 对里面的hash code算法不理解,就是LZ你说的那个hash静态方法。 感觉HashMap很犀利, 即有数组的优势,也有链表的特长 链表的是java.util.LinkedHashMap。 |
|
返回顶楼 | |
发表时间:2011-04-12
s929498110 写道 第三点
我感觉装载因子好像不推荐修改吧? 如果一次性容量扩充比较大的话 可以自己设定扩充倍数数量级的 但是说实话。装载因子的使用经验几乎为零。。。现在读大二,实战经验也没多少。就不发表意见了。。。 有用的,不过很难说清楚。 比如说,一个Map里面有很多元素,如果factor设置太小的话,内部的数组体积会少开辟空间,不过开辟新数组的次说也正增多了。这个还是需要估计大小才能决定。毕竟伐值内部大小,都可以算清楚。 |
|
返回顶楼 | |