11.1 泛型和类型安全的容器
想要定义一个用来保存Apple对象的ArrayList,可以这样声明ArrayList<Apple>
,这样通过使用泛型就可以在编译期防止将错误类型的对象放置到容器中
对于放入到容器中的类型,向上转型也可以像用于其他类型一样用于泛型(即泛型接受子类)
11.2 基本概念
java容器类库的作用是用来保存对象,并将其划分为两个不同的概念:
1.Collection
①List:按顺序保存元素
②Set:无重复
③Queue:按排队顺序
2.Map:用对象来关联对象的键值对
11.3 添加一组元素
Arrays.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变参数),并将其转换为一个List对象(这样产生的List对象的长度不可改变)。
Collection.addAll()方法接受一个Collection对象,以及一个数组或一个用逗号分隔的列表,将元素全部添加到Collection对象中
Collection的构造器可以接受一个Collection对象,用它来将自身初始化。
创建一个不包含元素的Collection对象,然后用Collections.addAll()来为Collection对象产生输入比使用Arrays.asList的效率高,所以Collections.addAll()是首选
11.4 容器的打印
打印容器无需任何帮助,直接print即可
11.5 List
asList-》转换为List
toArray-》转换为数组
当确定一个元素是否属于某个List,发现某个元素的索引,以及从某个List中移除一个元素,都会用到equals()方法
虽然LinkedList的插入删除速度比ArrayList快,但一般来说不会吧ArrayList转换为LinkedList再插入
subList允许从较大的列表创建出一个片段
11.6 迭代器
迭代器是用于将对容器的操作通用化,迭代器是一个对象,它的工作是遍历并选择序列中的对象。(轻量级:创建它的代价很小,所以有很多限制)
如:Iterator只能用来:
1.使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素
2.使用next()获得序列中下一个元素
3.使用hasNext()判断序列中是否还有下一个元素
4.用remove()将迭代器新近返回的元素删除
使用Iterator的优点:如传入参数Iterator,不需要知道容器的具体类型,只需要传递一个Iterator对象(容器对象都实现了Iterator接口),就是说Iterator统一了对容器的访问方法,能够将遍历序列的操作与序列底层的结构分离
11.6.1 ListIterator
ListIterator是比Iterator更强大,,他只能用于各种List,但是可以双向移动
11.7 LinkedList
LinkedList添加了可以使其用作栈,队列或双端队列的方法
11.8 Stack
Stack是用LinkedList实现的,
11.9 Set
set不保存重复的元素,通常会选择HashSet,它专门对快速查找进行了优化
TreeSet将元素存储在红黑树的数据结构中,所以如果想对结果排序,可以使用TreeSet来代替hashSet
使用contains()可以测试Set的归属性
11.10 Map
map可以返回它的键的Set,它的值的Collection,或者他的键值对的Set
11.11 Queue
LinkedList实现了Queue的接口,所以可以向上转型为Queue,对于Queue容器,peek()和element()都市查看队首。offer()是将一个元素插到队尾
11.11.1 PriorityQueue
优先级队列声明下一个弹出的对象不是等待最久的,而是优先级最高的(对叔子来说,越小优先级越高,字母A>B)
11.12 Collection和Iterator
实现了Collection就意味着需要提供Iiterator()方法
11.13 Foreach与迭代器
foreach不仅可以用于数组,也可以用于Collection对象(和数组用法类似)
11.13.1适配器与方法惯用法
暂留
11.14 总结
map与Collection的唯一联系就是map可以产生键和值的set