前言
花了点时间对照着JDK1.6树结构 ,做了下面这张图,以后复习方便多了。
图中椭圆形的是接口,棕色的长方形是抽象类,蓝色的长方形是普通类;红色线条是实现的接口。Ab是Abstract的简写。
1、Collection接口有三个子接口 Set,List,Queue。
2、为什么不直接实现Iterator,而是去实现Iterable?
JDK文档中Iterable只有一个方法就是iterator(),这个方法返回一个Iterator对象。由于Iterator进行遍历的时候会记录位置,假如直接取实现Iterator接口的话,遍历的起点不会每次都是开头,无法达到目的,所以需要返回一个Iterator对象。
所有的集合类都可以通过这个方法实现遍历。
3、Set用来表示一个不包含重复元素的集合,SortedSet进一步提供元素有序的Set,通过自然排序或者建立Set时提供的Comparator进行排序,Iterator遍历时采用升序。
NavigableSet 为给定搜索目标报告最接近匹配项的导航方法。
4、ArrayList与LinkedList有什么区别?
ArrayList基于动态数组的数据结构,在随机查找功能上优于LinkedList。
LinkedList基于链表的数据结构,在增加和删除功能上性能更好。
一般的使用的时候,都是用List指向一个具体对象。
5、ArrayList和Vector有什么区别?
ArrayList和Vector都是用数组存储对象的,且实现了List接口,从提供的方法上看很类似,但是也有区别。
首先 ArrayList的方法不是线程安全的,而Vector的所有方法是线程安全的,都使用了synchronized关键字。
其次 在数组增长方式上不同,当数据量达到默认的临界量后如0.75,这时ArrayList就会增加50%的大小,而Vector 增加一倍的空间。
由于同步会引起很大的系统开销,一般情况下都是使用ArrayList,在需要线程安全的时候使用Vector。
5、Stack的使用
push压栈 pop弹出栈 peek查看栈顶对象而不移出 empty是否为空。
6、Queue的使用
提供了两种添加移出查看的方法
add remove element 假如操作失败会抛出异常
offer poll peek 一般失败会返回false 或者null
具体查看JDK,实现类ArrayDeque和LinkedList
7、Deque "double ended queue" 双端队列,读作"deck"。
第一个元素(头部) | 最后一个元素(尾部) | |||
抛出异常 | 特殊值 | 抛出异常 | 特殊值 | |
插入 | addFirst(e) |
offerFirst(e) |
addLast(e) |
offerLast(e) |
移除 | removeFirst() |
pollFirst() |
removeLast() |
pollLast() |
检查 | getFirst() |
peekFirst() |
getLast() |
peekLast() |
补充面向对象的知识:
1、上面的AbList和ArrayList等都实现了List接口,这样是可以的。
这样做基于两点理由:1)历史的原因。
2)即使以后AbList不再实现List,ArrayList仍然实现了List,方便使用。
只要父类implements某一接口,子类完全继承也可以重新实现该接口;
对于抽象类可以不去实现接口的方法,而是交由具体类去实现,如AbList就可以不去实现List中的方法。