第十一章 持有对象


如果一个程序只包含固定数量的且其生命期都是已知的对象,那么这是一个非常简单的程序。
集合类(容器);list,set,queue,map
1.泛型和类型安全的容器
通过使用泛型,就可以在编译期防止将错误类型的对象放置到容器中,将元素从容器取出时,类型转换也不再是必须的。
可以将泛型的导出类,添加到容器中
2.基本概念
Java容器类类库的用途是”保存对象“,并将其划分为两个不同的概念。
1)Collection:一个独立元素的序列,这些元素都服从一条或多条规则。List必须按照插入的顺序保存元素,而Set不能
有重复元素。queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
Collection接口概括了序列的概念-- 一种存放一组对象的方式。
2)Map:一组成对的"键值对"对象,允许使用键来查找值。
3.添加一组元素
在java.util包中的Arrays和Collection类中都有很多实用方法,可以在一个Collection中添加一组元素。
Arrays.asList()方法接受一个数组或是一个逗号分隔的元素列表(使用可变参数),并将其转换为一个List对象。
Collection.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,将元素添加到Collection中。
4.容器的打印
使用Array.toString()来产生数组的可打印表示
对于容器,可以直接打印容器
5.List
List承诺可以将元素维护在特定的序列中。List接口在Collection的基础上添加了大量的方法,使得可以在中间插入和移除元素
有两种类型的List
1)基本的ArrayList:它长于随机访问元素,但是在List的中间插入和移除元素时较慢。
LinkedList:它通过代价较低的在List中间进行插入和删除操作,提供了优化的顺序访问。LinkedList在随机访问方面
相对较慢,但是它的特性集较ArrayList更大。
6.迭代器
迭代器是一个对象,它的工作是遍历并选择序列中的对象。
迭代器通常被称为轻量级对象:创建它的代价小,对迭代器有一些奇怪的限制
Java的iterator只能单向移动,这个Iterator只能用来:
1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
2)使用next()获得序列中的下一个元素
3)使用hasNext()检查序列中是否还有元素
4)使用remove()将迭代器新近返回的元素删除
6.1ListIterator
ListIterator是一个更加强大的Iterator的子类型,它只能用于各种List类的访问。尽管Iterator只能向前移动
但是ListIterator可以双向移动。它还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,
并且可以使用set()方法替换它访问过的最后一个元素。你可以通过调用listIterator()方法产生一个指向List开始处
的ListIterator,并且还可以通过调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
7.LinkedList
LinkedList也像ArrayList一样实现了基本的List接口,但是它执行某些操作(在List的中间插入和移除)时比ArrayList
更高效,但是在随机访问操作方面却要逊色一些。
LinkedList还添加了可以使其用作栈、队列或双端队列的方法。
getFirst()和element()完全一样,它们都返回列表的头(第一个元素),而并不移除它,如果List为空,则抛出NoSuchElementExecption
peek()方法与这两个方法只是稍有差异,它在列表为空时返回null
removeFirst()与remove()也是完全一样的,它们移除并返回列表的头,而在列表为空时抛出NoSuchElementExecption。
poll()稍有差异,它在列表为空时返回null   
addFirst()与add()和addList()相同,它们都将某个元素插入到列表的尾部
removeLst()移除并返回列表的最后一个元素。
8.Stack
"栈"通常是指”后进先出“(LIFO)的容器。有时栈也被称为叠加栈,因为最后”压入“栈的元素,第一个”弹出“栈。
LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用
9.Set
Set不保存重复的元素。Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection
只是行为不同。Set是基于对象的值来确定归属性的。
10.Map
将对象映射到其他对象的能力是一种解决编程问题的杀手锏。
Map与数组和其他的Collection一样,可以很容易地扩展到多维,而我们只需将其值设置为Map(这些Map的值可以是其他的
容器,甚至是其他Map)。因此,我们能够很容易地将容器组合起来从而快速地生成强大的数据结构。
11.Queue
队列是一个典型的先进先出(FIFO)的容器。即从容器一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序
是相同的。队列在冰法编程中特别重要。LinkedList提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList
可以用作Queue的一种实现,通过将LinkedList向上转型为Queue。
offer()方法:将一个元素插入到队尾,或者返回false。
11.1PriorityQueue
先进先出描述了最典型的队列规则。队列规则是指在给定一组队列中的元素的情况下,确定下一个弹出队列的元素的规则。
优先级队列生命下一个弹出元素是最需要的元素(具有最高的优先级)
当你再PriorityQueue上调用offer()方法来插入一个对象时,这个对象会在队列中被排序。默认的排序将使用对象在队列中
的自然顺序,但是你可以通过提供自己的Comparator来修改这个顺序。PriorityQueue可以确保当你调用peek()、poll()
和remove()方法时,获取的元素将是队列中优先级最高的元素。
12.Collection和Iterator
Collection是描述所有序列容器的共性的过根接口,它可能会被认为是一个”附属接口“,即因为要表示其他若干个接口的共性而
出现的接口。容器之间的所有共性都是通过迭代器达成的。这两种方法绑定到了一起,实现Collection就意味着需要提供iterator()方法。
13.Foreach与迭代器
foreach语法可以应用于任何Collectoin对象。

第十一章 持有对象

上一篇:MyEclipse 注册码分享


下一篇:【学习笔记】ACM与Java