一、基本概念
Java 容器类类库的用途是“保存对象”,并将其划分为两个不同的概念:
1)Collection。一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排队规则来确定对象生产的顺序(通常与它们被插入的顺序相同)。
2)Map。一组成对的“键值对”对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在莫中意义上讲,它将数字与对象关联在了一起。映射表允许我们使用另一个对象来查找某个对象,它被称为“关联数组”,因为它将某些对象与另外一些对象关联在一起;或者被称之为“字典”,因为你可以使用键对象来查找值对象,就像在字典中使用单词来定义一个List一样。
Collection接口概括了序列的概念————一种存放一组对象的方式。
二、添加一组元素
Arrays:Arrays.asList(一个数组或者一个用逗号分隔的元素列),转换为一个list对象
Collections:Collections.addAll(一个数组或者一个用逗号分隔的元素列或者一个collection对象);
Collection:Collection.addAll(一个collection对象),速度快首选。
注意:Arrays.asList()转换为List,其底层表示的是数组,因此不能调整尺寸,这时add与delete操作不支持。会报错
Arrays.asList():会判断所传数组或者参数列中的最小归集(如果List所接受的类型范围大于最小归集会报错,但是也可以现实的说明类型arrays.<类型>asList()),Collections.addAll()则不会。
三、容器的打印
Arrays.toString()打印数组,但是打印容器无需任何帮助。
四、迭代器
迭代器(也是一种设计模式)的概念可以用于达成对集合的取值、删除,迭代器是一个对象,他的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为轻量级对象:创建它的代价很小。
Java的Iterator只能单向移动,这个Iterator只能用来:
1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
2)使用next()获得序列中的下一个元素。
3)使用hasNext()判断序列是否还有元素
4)使用remove()将迭代器新返回的元素删除。
ListIterator是一个更加强大的Iterator的子类型。只用于各种List类的访问。可以双向移动,还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。
五、LinkedList
执行插入和移除时比ArrayList更高效,但是随即访问要逊色于ArrayList。
LinkedList还添加了可以使其用作栈、队列或双端队列的方法。
六、Stack
“栈”通常指“后进先出”(LIFO)的容器。有时栈也被称为叠加栈。
七、Set
Set不保存重复的元素,保存元素是无序的。Set中查找是非常高效的。HashSet专门对查找做了优化(使用了散列)。
Set具有和collection完全一样的接口,实际上Set就是collection,只是行为不同。Set是基于对象的值来确定归属性的。
八、Map
将对象映射到其他对象的能力是一种解决编程问题的杀手锏。
九、Queue
队列是一个典型的先进先出(FIFO)的容器。即放入顺序与取出顺序是一致的。
collection与Iterator
Collection是描述所有序列容器的共性的根接口。
生成Iterator是将队列与消费队列的方法连接在一起耦合度最小的方式。
Foreach与迭代器
可以用于数组喝容器对象。之所以能工作是因为Java5引入新的呗称为Iterable接口,该接口被Foreach用来在序列中移动。
如果你创建了任何实现Iterable的类,都适用于Foreach,
foreach语句可以用于数组或其他任何Iterable,但这并不意味着数组肯定也是一个Iterable,而任何自动包装也不会自动发生。
总结:
1)数组将数字与对象联系起来。他保存类型明确的对象,查询对象时,不需要对结果做类型转换。它可以时多维的,可以保存基本类型数据。但是数组一旦生成九不能改变了。
2)Collection保存单一的元素,而Map保存相关联的键值对。又了java泛型,你就可以指定容器中存放的对象类型,因此你就不会将错误类型的对象放置到容器中,并且从容器中获取值也不需要转型。Collection与Map会在你添加元素时自动调整尺寸。容器不能持有基本类型,但是自动包装机制会仔细地执行基本类型到容器中所持有的包装器类型之间的双向转换。
3)像数组一样,List也建立数字索引与对象的关联;因此数组喝List都是排序好的容器。List能够自动扩容。
4)如果要进行大量的随机访问,就是用arrayList;如果经常从表中间插入或者删除元素,则应该使用LinkedList。
5)各种Queue以及栈的行为,由LinkedList提供支持。
6)Map是一种对象(而非数字)与对象相关联的设计。HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问的能力。
7)Set不接受重复的元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。
8)新程序中不应该使用过多的Vector、HashTable和Stack。
容器分类图(不包含抽象对象与历史遗留构件):