用了java集合这么久,尚未系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获。java
1、全部集合都实现了Iterable接口。数组
Iterable接口中包含一个抽象方法:Iterator<T> iterator();每一个实现了这个方法的集合都会返回一个Iterator对象。安全
Iterator:它包含三个方法,hashNext(),next(),remove()三种方法,经过它们能够实现集合的遍历和元素删除,例如:微信
Collection<String> list = new ArrayList<String>();函数
list.add("a"); spa
list.add("b"); 线程
list.add("c");对象
Iterator<String> iterator = list.iterator();blog
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),各个迭代器之间互不影响。
2、ListIterator
从AbstractList起封装了public ListIterator<E> listIterator()方法,返回一个ListIterator,它在Iterator的基础上增长了add(),previous(),hasPrevious()等方法,能够实现双向遍历。
AbstractList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
ListIterator<String> iterator = list.listIterator(3);
while (iterator.hasPrevious()) {
String element = iterator.previous();
System.out.println(element);//c,b,a
}
3、比较
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值。
4、Collections和Arrays
Collections:java.util下的一个专用类,它包含有各类有关集合操做的静态方法,可实现对各类集合的搜索、排序、线程安全化等操做。
Arrays:java.util下的一个专用类,用来操做array ,提供搜索、排序、复制,转换等静态方法。
关注老姜谈技术,微信号:helojava,或者扫描下面二维码。
每日一帖,技术鸡汤。