论坛风格切换切换到宽版
  • 2791阅读
  • 26回复

HashMap深度分析与比较- - [复制链接]

上一主题 下一主题
 
发帖
337
白金币
603
威望
16
人气
0
昵称
我玩过
正在玩
爱好
只看楼主 倒序阅读 楼主  发表于: 2006-06-01
第一个话题: HashMap的内部实现
最先是看到这篇文章深有感触.
http://www.matrix.org.cn/article/984.html

我的结论:
1. HashMap内部基本是个散列表.初始容量DEFAULT_INITIAL_CAPACITY=16, loadfactor=0.75,实际初始容量为16X0.75=12
2. 使用put(key, value)时
1). 根据HashMap的key算出hashcode,算法是native的, 看不到:(
2). 得到hashcode之后, 算出这个key在散列表中的index
3. 对散列表index的entry进行询问, 条件是
1) e.hash==key的hashcode(通过obj.hashcode()方法得到数值之后还有一系列操作才能得到ke的hashcode, 见HashMap.hash()方法)
2) e.key==key || key.equals(e.key)

4. 如果询问有结果,就替代原obj,其实这里的put有返回的.
HashMap hs = new HashMap();
hs.put("key1", "string1");
Object obj = hs.put("key1", "string2");
System.out.println(obj);
System.out.println(hs.get("key1"));
打印结果得到
string1
string2

5. hashtable的实现和hashmap的实现差不多,只是多了同步

第二个话题: 其他的Collection
1. TreeSet内部是使用compareTo, 而HashSet是equalsTo
所以当加入new BigDecimal("1.0");
new BigDecimal("1.00");时
HashSet中将有两个元素,而TreeSet中只有一个

2. 一段小程序,演示LinkedHashSet:
import java.text.DateFormatSymbols;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;


public class Tree_MapAndSetTest {

public static void main(String[] args) {
String months[] =
new DateFormatSymbols(Locale.US).getMonths();
String italianMonths[] =
new DateFormatSymbols(Locale.ITALIAN).getMonths();
List list = Arrays.asList(months);
Set orderedSet = new LinkedHashSet(list);
Set unorderedSet = new HashSet(list);
System.out.println("Ordered: " + orderedSet);
System.out.println("Unordered: " + unorderedSet);


Map orderedMap = new LinkedHashMap();
Map unorderedMap = new HashMap();
for (int i=0, n=months.length; i < n; i++) {
orderedMap.put(months, italianMonths);
unorderedMap.put(months, italianMonths);
}
System.out.println("Ordered: " + orderedMap);
System.out.println("Unordered: " + unorderedMap);


Collection values = orderedMap.values();
for (Iterator i = values.iterator(); i.hasNext();
System.out.println(i.next()));


Map accessorderedMap =
new LinkedHashMap(20, .80f, true);
for (int i=0, n=months.length; i < n; i++) {
accessorderedMap.put(months, italianMonths);
}
accessorderedMap.get("June");
accessorderedMap.get("April");
accessorderedMap.get("February");
System.out.println(accessorderedMap);

}
}


结果是:
Ordered: [January, February, March, April, May, June, July, August, September, October, November, December, ]
Unordered: [December, March, April, November, September, October, May, June, August, February, January, July, ]
Ordered: {January=gennaio, February=febbraio, March=marzo, April=aprile, May=maggio, June=giugno, July=luglio, August=agosto, September=settembre, October=ottobre, November=novembre, December=dicembre, =}
Unordered: {March=marzo, December=dicembre, April=aprile, November=novembre, September=settembre, October=ottobre, May=maggio, June=giugno, August=agosto, January=gennaio, February=febbraio, July=luglio, =}
gennaio
febbraio
marzo
aprile
maggio
giugno
luglio
agosto
settembre
ottobre
novembre
dicembre

{January=gennaio, March=marzo, May=maggio, July=luglio, August=agosto, September=settembre, October=ottobre, November=novembre, December=dicembre, =, June=giugno, April=aprile, February=febbraio}


第三个话题: 最后再重复罗嗦下
HashMap和HashTable的区别
1 access to the Hashtable is synchronized on the table while access to the HashMap isn\'t
2 HashMap is fail-safe while the enumerator for the Hashtable isn\'t
3 HashMap permits null values in it, while Hashtable doesn\'t

em19 em19
评价一下你浏览此帖子的感受

火星

寂寞

发骚

和谐

找抽

福利

无害

基情
发帖
1407
白金币
1797
威望
299
人气
22
昵称
我玩过
正在玩
爱好
只看该作者 沙发  发表于: 2006-06-01
:?: :?: :?: :shock:
发帖
1571
白金币
1236
威望
0
人气
0
昵称
我玩过
正在玩
爱好
只看该作者 板凳  发表于: 2006-06-01
水帖
发帖
3491
白金币
13515
威望
529
人气
4
昵称
我玩过
正在玩
爱好
只看该作者 地板  发表于: 2006-06-01
lz想说啥?教大家数据结构? :?:

发帖
3590
白金币
3428
威望
663
人气
6
昵称
老虎
我玩过
EQ
正在玩
你猜
爱好
只看该作者 粪坑  发表于: 2006-06-01
他在骗水..
ts

发帖
20288
白金币
27318
威望
4485
人气
85
昵称
我玩过
D2,石器,EQ,EQ2,EVE,激战,指环王
正在玩
FF14
爱好
只看该作者 粪坑边缘  发表于: 2006-06-01
灌水 em874 em874
发帖
538
白金币
1317
威望
24
人气
4
昵称
我玩过
正在玩
爱好
只看该作者 前排围观  发表于: 2006-06-02
有JJ切JJ,没JJ就算了~~~

发帖
7889
白金币
1216
威望
1796
人气
1
昵称
我玩过
传奇.mu.EQ.eq2.EVE.LOTRO.天下1天下2天下3.wow. 九阴真经.暗黑3  
正在玩
文明5
爱好
只看该作者 7 发表于: 2006-06-02
[quote]有JJ切JJ,没JJ就算了~~~[/quote]
巨魔的再生能力和蜥蜴一样强,我看还是和你一起做生物处理算了 em08

发帖
5074
白金币
7522
威望
777
人气
15
昵称
我玩过
正在玩
爱好
只看该作者 8 发表于: 2006-06-02
我的膜拜者 有多了一个。
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 9 发表于: 2006-06-02
[quote]我的膜拜者 有多了一个。[/quote]

em28 em875 em875 em875 em875
发帖
1104
白金币
1927
威望
96
人气
24
昵称
我玩过
EQ2,GW1,GW2
正在玩
GW2
爱好
只看该作者 10 发表于: 2006-06-02
em564 偶还以为深度剖析黑色部分馁~

小板凳和爆米花都准备好了~

算啦~等着看生物处理巨魔~

也8错~也8错~
ts

发帖
20288
白金币
27318
威望
4485
人气
85
昵称
我玩过
D2,石器,EQ,EQ2,EVE,激战,指环王
正在玩
FF14
爱好
只看该作者 11 发表于: 2006-06-02
[quote]em564 偶还以为深度剖析黑色部分馁~

小板凳和爆米花都准备好了~

算啦~等着看生物处理巨魔~

也8错~也8错~[/quote]
原来你喜欢巨魔 :oops:
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 12 发表于: 2006-06-03
偶喜欢女巨魔
发帖
337
白金币
603
威望
16
人气
0
昵称
我玩过
正在玩
爱好
只看该作者 13 发表于: 2006-06-03
[quote]偶喜欢女巨魔[/quote]
公的比较可爱(没开模型的),特别是变小的时候。。。
可爱到有想去捏一下的冲动。。
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 14 发表于: 2006-06-03
[quote][quote]偶喜欢女巨魔[/quote]
公的比较可爱(没开模型的),特别是变小的时候。。。
可爱到有想去捏一下的冲动。。[/quote]

那是你又不是偶咯~~~~

发帖
751
白金币
448
威望
130
人气
8
昵称
我玩过
正在玩
爱好
只看该作者 15 发表于: 2006-06-03
[quote][quote]有JJ切JJ,没JJ就算了~~~[/quote]
巨魔的再生能力和蜥蜴一样强,我看还是和你一起做生物处理算了 em08[/quote]

其实,作为一个shm而言,切jj配变身药水是一个理想的选择
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 16 发表于: 2006-06-04
[quote][quote][quote]有JJ切JJ,没JJ就算了~~~[/quote]
巨魔的再生能力和蜥蜴一样强,我看还是和你一起做生物处理算了 em08[/quote]

其实,作为一个shm而言,切jj配变身药水是一个理想的选择[/quote]
em28
发帖
337
白金币
603
威望
16
人气
0
昵称
我玩过
正在玩
爱好
只看该作者 17 发表于: 2006-06-05
[quote][quote][quote][quote]有JJ切JJ,没JJ就算了~~~[/quote]
巨魔的再生能力和蜥蜴一样强,我看还是和你一起做生物处理算了 em08[/quote]

其实,作为一个shm而言,切jj配变身药水是一个理想的选择[/quote]
em28[/quote]
:evil: :evil:

<-巨魔SHM....
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 18 发表于: 2006-06-05
哈哈,别自己跳出来啊

发帖
11083
白金币
14929
威望
3303
人气
48
昵称
winding thend 德莫 坚果
我玩过
MUD.UO.EQ.PSOL.EVE.LOTRO.天下2.WOT
正在玩
激战2美服 EVE
爱好
书 电影 游戏
只看该作者 19 发表于: 2006-06-05
主动承担是好事

发帖
5074
白金币
7522
威望
777
人气
15
昵称
我玩过
正在玩
爱好
只看该作者 20 发表于: 2006-06-05
坦白从严,牢底坐穿
抗拒从宽,回家过年。

发帖
11083
白金币
14929
威望
3303
人气
48
昵称
winding thend 德莫 坚果
我玩过
MUD.UO.EQ.PSOL.EVE.LOTRO.天下2.WOT
正在玩
激战2美服 EVE
爱好
书 电影 游戏
只看该作者 21 发表于: 2006-06-05
坦白从严,抗拒打残
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 22 发表于: 2006-06-05
对别人要好点的嘛,不要动不动的就打啊,什么的
要学乖点啊

发帖
11083
白金币
14929
威望
3303
人气
48
昵称
winding thend 德莫 坚果
我玩过
MUD.UO.EQ.PSOL.EVE.LOTRO.天下2.WOT
正在玩
激战2美服 EVE
爱好
书 电影 游戏
只看该作者 23 发表于: 2006-06-05
好深奥
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 24 发表于: 2006-06-05
还可以了啊,没多深奥啊

发帖
11083
白金币
14929
威望
3303
人气
48
昵称
winding thend 德莫 坚果
我玩过
MUD.UO.EQ.PSOL.EVE.LOTRO.天下2.WOT
正在玩
激战2美服 EVE
爱好
书 电影 游戏
只看该作者 25 发表于: 2006-06-05
淫者见淫,痔者见痔
发帖
10615
白金币
8830
威望
1292
人气
35
昵称
我玩过
正在玩
爱好
只看该作者 26 发表于: 2006-06-05
[quote]淫者见淫,痔者见痔[/quote]
哈哈
快速回复
限300 字节
 
上一个 下一个