论坛首页 Java企业应用论坛

三顾java.util.HashMap

浏览 8715 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2011-04-11  
第四点

文档上的说明不好用吗?
Map m = Collections.synchronizedMap(new HashMap(...));
这样的一个HashMap线程不安全? 表示完全没试过。。。仅存理论啊
0 请登录后投票
   发表时间:2011-04-11  
s929498110 写道
LZ

HashMap容器重新装载的方法, 你修改的不正确

比如第一个key的哈希值是1234
第二个key的哈希值是12345
可能旧的容器的 table.length比较小, indexOf返回的值是一样的
而新的容器的table.length比较大, indexOf的返回值可能不一样!

也就是容器扩充之后, 原来挂载点相同的Entry,新的挂载点可能不同

你感觉我说的对不?

赞同!

0 请登录后投票
   发表时间:2011-04-11  
s929498110 写道
第三点

我感觉装载因子好像不推荐修改吧? 如果一次性容量扩充比较大的话
可以自己设定扩充倍数数量级的

但是说实话。装载因子的使用经验几乎为零。。。现在读大二,实战经验也没多少。就不发表意见了。。。

如何自己设定扩充数量级?
0 请登录后投票
   发表时间: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);
	}


   话说, 我们系有一个女生叫贾轶凯,名字挺像的
0 请登录后投票
   发表时间: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);
	}


   话说, 我们系有一个女生叫贾轶凯,名字挺像的
0 请登录后投票
   发表时间:2011-04-12  
晕。。。 网络一卡
放了两遍。。。
零点了, 睡觉! 明天还得早起去实验室干活呢!
0 请登录后投票
   发表时间:2011-04-12  
s929498110 写道
第四点

文档上的说明不好用吗?
Map m = Collections.synchronizedMap(new HashMap(...));
这样的一个HashMap线程不安全? 表示完全没试过。。。仅存理论啊

得到SynchronizedMap的实例,这个类作为Collection内部类。你是否选用这种方法来处理同步问题,那就看你的选择了。
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2011-04-12  
s929498110 写道
我最近也在看Collection的源码

卡在HashMap这里两天了。 对里面的hash code算法不理解,就是LZ你说的那个hash静态方法。 感觉HashMap很犀利, 即有数组的优势,也有链表的特长


链表的是java.util.LinkedHashMap。
0 请登录后投票
   发表时间:2011-04-12  
s929498110 写道
第三点

我感觉装载因子好像不推荐修改吧? 如果一次性容量扩充比较大的话
可以自己设定扩充倍数数量级的

但是说实话。装载因子的使用经验几乎为零。。。现在读大二,实战经验也没多少。就不发表意见了。。。


有用的,不过很难说清楚。

比如说,一个Map里面有很多元素,如果factor设置太小的话,内部的数组体积会少开辟空间,不过开辟新数组的次说也正增多了。这个还是需要估计大小才能决定。毕竟伐值内部大小,都可以算清楚。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics