11.1泛型和类型安全的容器

ArrayList保存的是Object.

通过泛型来声明容器实例可以保存的类型。如:ArrayList)尖括号中指明“类型参数”,这样可以在编译期防止将错误类型放入容器中。

当指定了某个类型作为泛型的参数时,并不仅局限于只能将该确切类型放置到容器中,其子类也是被允许的。

11.2基本概念:

1、Collection:一个独立元素的序列。

2、Map:组成“键值对”的对象,允许通过键进行查找。

11.3添加一组元素:

Arrays和Collections类

1、Arrays.asList():接收一个数组或是有都好分隔开的元素列表,并将其转化为List对象。

2、Collections.addAll():接收一个Collection对象,以及一个数组,或一个用逗号分隔的列表,将元素添加到Collection中。

3、Collection.addAll():接收一个Collection对象将自身初始化;Collection.addAll()方法运行起来要快很多,因此创建一个不包含元素的Collection,然后调用Collections.addAll()方法很实用。

11.5List

List:将元素维护在特定的序列中。

有两种类型的List:

ArrayList:用于随机访问元素,在其中进行插入或删除操作则比较慢。

LinkedList:在其中进行插入或删除操作代价较低,并提供了优化的顺序访问(随机访问方面LinkedList相对ArrayList比较慢)

具体方法详见JDK API

*******************当确定一个元素是否在List中,发现某个元素的索引,以及从某个List中移除一个元素,都会用到equals()方法(继承于Object类)

******************subList(fromIndex, toIndex)方法返回一个片段,在此片段上进行的修改会影响初始列表。

******************在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以throw UnsupportedOperationException。

解决方法:List ints = new ArrayList(Arrays.asList(0,1,2,3,4,5,6,7,8,9));

11.6迭代器Iterator

1、Iterator只能单向移动;

2、使用iterator()方法要求容器返回一个Iterator,Iterator将准备好返回序列的第一个元素。

3、使用next()方法获取序列中的下一个元素;

4、使用hasNext()方法检验序列中是否还有元素;

5、remove()从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用next只能调用一次此方法。

如果尚未调用next()方法,或上次调用next()方法之后已经调用了remove()方法,则会抛出异常——IllegalStateException

11.6.1ListIterator

1、ListIterator是Iterator的一个子类型,它只能用于各种List类的访问。

2、Iterator只能向前移动,而ListIterator可以双向移动。

3、它还可以产生相对于迭代器在列表总当前指向的前一个及后一个元素的索引。

4、listIterator()方法可以产生一个指向List开始处的listIterator。

5、listIterator(n)方法可以产生一个一开始就指向列表索引为n的元素的listIterator

11.7LinkedList

如同ArrayList一样实现了基本的List接口,它在执行某些操作(插入、移除)时比ArrayList更高效,但随机访问操作方面却要逊色一些。

LinkedList添加了可以使其用作栈、队列或双端队列的方法。

——具体方法详见API

11.7练习题:

Iterator只能单向移动;

与之相对应的ListIterator可以双向移动。

List接口方法:listIterator()返回此列表元素的列表迭代器(ListIterator)。listIterator方法与subList方法一样,在方法返回的

ListIterator对象上进行增删操作会影响初始列表。

11.8Stack栈

栈:通常指后进先出的容器(LinkedList具有能够直接实现栈的所有功能的方法)

11.9Set集合

Set不保存重复的元素

11.10Map

将对象(而非数字)映射到其他对象。

HashMap用来进行快速访问。

TreeMap保持键适中处于某种排序状态,因此速度没有HashMap快。

11.11Queue队列

先进先出的容器,从一端放入,从另一端取出。放入顺序与取出的顺序相同。

(Queue与Stack的行为由LinkedList提供支持)

——新程序中不应使用过时的Vector、HashTable和Stack

-------------------------------------------

常用方法:

1、Arrays.asList():接收一个数组或是有都好分隔开的元素列表,并将其转化为List对象。

2、Collections.addAll():接收一个Collection对象,以及一个数组,或一个用逗号分隔的列表,将元素添加到Collection中。