用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获。
一、所有集合都实现了iterable接口。
iterable接口中包含一个抽象方法:iterator iterator();每个实现了这个方法的集合都会返回一个iterator对象。
iterator:它包含三个方法,hashnext(),next(),remove()三种方法,通过它们可以实现集合的遍历和元素删除,例如:
collection list = new arraylist();
list.add(a);
list.add(b);
list.add(c);
iterator iterator = list.iterator();
while (iterator.hasnext()) {
string element = iterator.next();
system.out.println(element);//a b c
}
system.out.println(list);//[a, b, c] iterator = list.iterator(); iterator.next();
iterator.remove();
system.out.println(list);//[b, c]
ps:为什么不直接实现iterator接口呢?因为:iterator会携带当前集合的位置信息,下次使用再使用的时候就非从0开始了;而iterable接口每次都返回一个iterator对象(通过内部类实现iterator),各个迭代器之间互不影响。
二、listiterator
从abstractlist起封装了public listiterator listiterator()方法,返回一个listiterator,它在iterator的基础上增加了add(),previous(),hasprevious()等方法,可以实现双向遍历。
abstractlist list = new arraylist();
list.add(a);
list.add(b);
list.add(c);
listiterator iterator = list.listiterator(3);
while (iterator.hasprevious()) {
string element = iterator.previous();
system.out.println(element);//c,b,a
}
三、比较
arraylist:允许存放重复元素,且元素是有序的,随机访问比较方便。
linkedlist:链表实现,插入和删除时更优于arraylist。
hashset:不允许重复元素且无序(散列函数对元素进行排序,可快速查询),允许null值。
treeset:红黑树排序,可进行排序,包含的元素要实现comparable接口并定义compareto方法,不允许null值。
hashmap:线程不安全,key和值都允许null,判断是否包含key要使用containskey()方法,不允许重复key,hash数组的默认大小是16,而且一定是2的指数,重新计算hash值。
hashtable:线程安全,key和value都不允许出现null值,不允许重复key,数组默认大小是11,增加的方式是 old*2+1,使用包含对象的hash值。
四、collections和arrays
collections:java.util下的一个专用类,它包含有各种有关集合操作的静态方法,可实现对各种集合的搜索、排序、线程安全化等操作。
arrays:java.util下的一个专用类,用来操作array ,提供搜索、排序、复制,转换等静态方法。