集合类:List、Set、Queue、Map
11.1 泛型和类型安全容器
ArrayList apples = newArrayList(); //可以存放任何object
ArrayList<Apple> apples= new ArrayList<Apple>();//声明只能存放apple类型,是更安全的。
get() size() add()等常用函数。
11.2 基本概念
java容器类类库:保存对象。分:Collection和Map
Collection:一个独立元素的序列,这些元素都服从一条或多条规则。
Map:一组成对的“键值对”对象,允许使用键来查找。
Set在add()时,有去除重复的检查。
11.3 添加一组元素
[1] 向一个Collection中添加一组元素,Arrays.asList(),Collection.addAll()
[2] List<Integer> list =Arrays.asList(14,15); 初始化的list,无法修改大小,底层仍然是数组。
[3] AsList(a,b)返回类型根据决定的,不能自动向上转型,可以显式转换。
List<Snow> snow4 =Arrays.<Snow> asList(new Light(), new Heavy());
[4] Map更复杂,只能使用另一个Map来初始化。
11.4 容器的打印
数组打印要Arrays.toString(),容器打印可以直接使用System.out.print();
List:ArrayList 和LinkedList,按插入顺序保存元素,不同在于执行某些操作时的性能。
Set:HashSet,最快获取元素,保存顺序无意义;TreeSet,按增序存储;LinkedSet,按插入顺序保存。
Map:添加是put(key,value),HashMap,TreeMap,LinkedMap保存顺序与对应名称一样。后面键相同的插入,会覆盖掉之前键对应的值
11.5 List
将元素维护在特定的序列中。
ArrayList 随机访问元素,插入删除较慢
LinkedList 插入删除代价低,随机访问比较慢
有很多方法sort() , remove(), add(),containAll(), 等等
从一个list中生成sublist,删除list中的sublist时,要先copy再,copy.removeAll(sublist),再将copy赋值给list. 否则会有CurrentModifyException
11.6 迭代器
是一个对象,用来遍历并选择序列中的对象。轻量级对象,创建代价小。
Iterator只能单向移动,只有四种操作,
[1] Iterator()返回一个Iterator(序列中的第一个元素);
[2] next()获取下一个元素;
[3] hasNext()是否有其他元素;
[4] remove()将迭代器新近返回的元素删除。
迭代器统一了对容器的访问方式。
Iterator<String> it =list.iterator(); //获取迭代器
ListIterator可以双向移动,set()方法替换访问的最后一个元素,hasPrevious()等
ListIterator<String> it= list.listIterator();
11.7 LinkedList
执行插入删除操作时更高效,还添加了可以用作栈,队列或双端队列的方法。poll() peek()
removeFirst() , addFirst(), offer()等。
11.8 Stack
栈:先进后出。
LinkedList 可以很好的实现Stack的功能,pop() push()等。默认包在java.util.Stack
栈可以用来表达式求值。
11.9 Set
Set不保存重复元素,经常被使用来测试归属性,测试某个对象是否在Set中。
要求查找效率高,多用HashSet,使用了散列,输出是无序的。
TreeSet可以按序(字典序)输出,可以传入构造器,修改字典序结构不区分大小写。
Set<String> words = newTreeSet<String>(String.CASE_INSENSITIVS_ORDER);
11.10 Map
[1] Map由键和值两部分组成,键相当于Set,值相当于Collection。整体是Set,不能重复。Map<Integer,Integer> m =new HashMap<Integer,Integer>();
[2] 扩展,Map中的键和值可以是对象或容器。
[3] Map<Person, List<?extends Pet>> petPeople = newHashMap<Person, List<? extends Pet>>(); “?”就是通配符,而“? extends Pet”则表示通配符“?”的上界为Pet,换句话说就是,“? extends Pet”可以代表Pet或其子类,可代表不了Pet的父类(如Object),因为通配符的上界是Pet。
11.11 Queue
[1] 先进先出,用作将对象从程序的某个区域传输到另一个区域,LinkedList实现了Queue接口。Queue<Integer> q = newLinkedList<Integer>();
[2] q.offer()将元素插入队尾,peek() element()返回队头不删除,poll() remove()返回队头且删除。
[3] 优先级队列,PriorityQueue<Integer> q = new PriorityQueue<Integer>();下一个弹出的元素是最需要的,即优先级最高的。插入对象时,会被排序(通过自己提供的Comparator),默认是自然排序(从小到大)。
11.12 Collection 和Iterator (待看懂 )
[1] Collection是描述所有序列容器的共性的根接口,附属接口,抽象出来的。
[2] 使用接口是它可以使我们能够创建更通用的代码。
[3] C++中没使用任何公共基类,共性通过使用迭代器来完成。
[4] 如果实现Collection,就必须实现iterator(),通过继承AbstractCollection类。
11.13 Foreach与迭代器
foreach语法主要用于数组,也可用于任何Iterable(Collection等的基类,也就是List,Set等都可以用foreach。
适配器方法:在默认的向前迭代的基础上,添加向后迭代。不能用覆盖,而是添加可以产生Iterable对象的方法。
Arrays.asList()产生的list对象使用底层数组作为物理存储。
11.14 总结
总结非常全面
常用的ArrayList、 LinkedList 、 HashSet 、HashMap
数组不可扩容,容器可以。
过期的不要用Vector、Stack等