您的位置:首页 > 其它

观察比较ArrayList,HashSet,HashMap的存储机制

2010-04-05 14:41 274 查看
//自从知道了for循环中有迭代list集合的用法后,从此while就受到冷落了!

public void test1() {
List<String> list = new ArrayList<String>();
list.add("aab");
list.add("ccc");
list.add("ccc");
for (Iterator<String> iter = list.iterator(); iter.hasNext();) {//我最喜欢的for循环应用之迭代list集合
System.out.println(iter.next());

}

}

//上面的用法真得比用while语句简洁好多,难怪老外喜欢这么用呀.

//下面的增强for循环更是让人眼前一亮!简洁得不能再简洁!

@Test
public void test2() {
List<String> list = new ArrayList<String>();
list.add("aab");
list.add("bbb");
list.add("ccc");//本处开始添加重复元素(包括下面的null重复元素)是为了在myeclipse中观察ArrayList中对于重复元素的存储机制
list.add("ccc");
list.add(null);
list.add(null);
list.add(null);
for (String string : list) {
System.out.println(string);
}
}

经过观察后,得到部分结论与JDK规范中相同:

最直观的是可以看到采用顺序表存储方式,每添加一个元素无论为null或重复元素,长度都会加1.

//下面是对HashSet集合的观察源码

@Test
public void test22() {
Set<String> list = new HashSet<String>();
// Set<int> list2 = new HashSet<int>();
list.add("aab");
list.add("bbb");
list.add("ccc");
list.add("ccc");
list.add(null);
list.add(null);
list.add(null);
System.out.println(list.size());
for (String string : list) {
System.out.println(string);
}
}

可以看到,HashSet基于HashMap机制,但只使用了HashMap的Key而没有使用HaspMap的Value.只要发现原来存在相同的key元素,就不会存入重复的直接返回,其中包括null空元素.

//下面是观察HashMap的存储机制的源码

@Test
public void test3() {
Map<String, String> map = new HashMap<String, String>();
map.put("11", "aaa");
map.put("22", "bbb");
map.put("33", "ccc");//在本处设置断点开始观察
map.put("33", "ddd");//由于本处存在相同的Key,所以原来存储的"ccc"会被替换为本处的"ddd"
Set<Map.Entry<String, String>> set = map.entrySet();
for (Entry<String, String> entry : set) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}

通过多次Ctrl+点击,Step into工具观察执行源码的流程后,基本上可以明了HashMap的执行流程中的存储机制,不过对于其中的Hash代码还不是很理解,只能以后再加强学习了.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: