Java 集合框架
Java 集合框架
ps:写这篇文章主要为了整理一下Java 的类集合框架,如有错误或不全,欢迎纠正
converseJava集合框架图
java 集合框架继承图图片摘自网络
补充一下上图:
- 继承自Iterator的是ListIterator而不是LinkIterator
-
加一个Deque接口继承自Queue
在这里插入图片描述
集合框架分析
整个Java集合框架其实被分为两部分,Collection和Map,但我们一般也称Map是Collection。从集合框架图我们可以看到,Map指出一个箭头produce指向Collection,这是因为Map的key,value,entry都是Set,而Set是继承自Collection。所以我们一般也说Map是Collection,Colleciton是java集合框架的顶层类。
1.Interator 迭代器
迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。源自百度百科
迭代器顾名思义,用来迭代集合,Colleciton是Java集合框架的顶层接口,而Collection实现了iterator,也就意味着所有继承自Colleciton的子类也就具有了迭代的能力。
public interface Iterable<T> {
Iterator<T> iterator();
//还有两个default接口
...
...
}
这个接口定义了一个iterator方法,每一个Collection必须返回自己实现的迭代器。
我们看一下迭代器的实现:
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
主要的两个方法:next、hasNext。根据每一个集合的特性方法的内部实现有所不同,但提供给外部的功能都一样,分别是判断迭代的下一个位置是否有元素、返回当前元素然后迭代的当前位置+1,以ArrayList为例:
ArrayList<String> arrayList = new ArrayList<>();
//Iterator接口中定义的方法,这个额迭代器的具体实现在ArrayList中以内部类的形式存在
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
String temp = iterator.next();
System.out.println(temp);
}
2.集合工具类
- Arrays
- Collections
类中有很多静态方法,用来操作数组和集合,很多方法很实用,比如
- Arrays.toSort(List list); 对集合排序
- Arrays.toString(array);格式化打印数组
- List<String syncList = Collections.synchronizedList(mList); 将一个List转换成线程安全的List。
- ......
3.List
特性:
- 有序集合
- 元素允许重复,并且允许为null
- 可以通过索引得到指定位置元素
常用的有如ArrayList、LinkedList都直接或间接实现了List。
4.Set
特性:
- 无法通过索引获取元素
- 元素不允许重复,通过集合存储元素的equals方法来判断重复。
- 无法保证Set中元素迭代顺序和存储顺序相同
- 常用集合如HashSet、TreeSet
- HashSet:基于哈希值散列存储,性能高,添加和删除操作的时间复杂度恒定,无序
- TreeSet:通过存储元素实现的Comparable接口来对TreeSet中的元素进行排序,遍历TreeSet时按排序后的顺序输出。
4.Queue、Deque
Queue代表着单向队列,先进先出,从队尾入队,队头出队,两个操作对应接口中的两个方法:
public interface Queue<E> extends Collection<E> {
//插入队尾
boolean offer(E e)
//得到队头元素并移除
E poll();
//得到对头元素不移除
E peek();
}
Deque代表双向队列:扩展了Queue。可以通过Deque实现Stack:后进先出,队尾入队,队尾出队,对应的两个方法:
public interface Deque<E> extends Queue<E> {
//push 元素 入栈
void push(E e);
//pop 元素 出栈
E pop();
Map
是一种从Key到Value的映射的数据结构:
HashMap<Integer, String> hashMap = new HashMap<>();
hashMap.put(1,"数字1");
hashMap.put(10,"数字10");
String result = hashMap.get(10);
可以通过Key得到相应的Value。
其中Map有三个方法
- KeySet
- values
- entrySet
分别返回Map中存储的键值对的Key集合、Value集合、存储键值对的Entry的类集合。这也就是为什么说虽然Map不继承自Collection,但通常也说Map是Java集合框架中的一员。