观察比较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代码还不是很理解,只能以后再加强学习了.
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代码还不是很理解,只能以后再加强学习了.
相关文章推荐
- 跟着源码看ArrayList、LinkedList、HashMap、HashSet的内部存储机制
- ArrayList、LinkedList和HashSet、TreeSet以及HashMap、TreeMap是如何实现存储的?
- Java中HashMap和HashSet存储机制
- Hash存储机制 - HashMap原理 HashSet原理
- HashMap、HashSet、ArrayList实现机制
- HashMap、HashSet 的源代码分析其 Hash 存储机制
- 通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
- ArrayList与LinkedList、TreeSet与HashSet、HashMap与LinkedHashMap之间的比较
- hashmap和hashset的存储机制
- ArrayList与LinkedList、TreeSet与HashSet、HashMap与LinkedHashMap之间的比较
- 通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
- ArrayList、LinkedList和HashSet、TreeSet以及HashMap、TreeMap是如何实现存储的?
- ArrayList、LinkedList和HashSet、TreeSet以及HashMap、TreeMap是如何实现存储的?
- java-通过 HashMap、HashSet 的源代码分析其 Hash 存储机制
- ArrayList、LinkedList和HashSet、TreeSet以及HashMap、TreeMap是如何实现存储的?
- 黑马程序员---看ArrayList_HashSet的比较及Hashcode分析视频查阅的资料总结
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
- Java高新技术之ArrayList_HashSet的比较及Hashcode分析
- ArrayList、Vector、HashMap、HashSet的默认初始容量、加载因子、扩容增量
- java-集合(6)-TreeSet,HashSet与TreeSet比较,HashMap,TreeMap只有在排序的功能时使用