对象的集合
数组
数组标识符其实只是一个引用,指向在堆(heap)中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用。
java.util. Arrays它有一套 static方法,提供操作数组的实用功能。
要保存基本类型,则只能用数组。
如果你复制对象数组,那么只是复制了引用——不会出现两份对象的拷贝。这被称作浅复制、浅拷贝(shallow copy)
Collection:一组独立的元素,通常有某种规则应用于其上。List必须保持元素特定的顺序,而 Set不能有重复元素。
Map:一组成对的键值对(key-value)对象。Map可以返回所有键组成的Set,所有值组成的 Collection,或其键值对组成的Set。
Java的容器类有两种基本类型,区别在于容器中每个位置保存的元素个数。Collection每个位置只能保存一个元素。包括List,它以特定的顺序保存一组元素;Set,元素不能重复。ArrayList 是一种List,而HashSet是一种Set。将元素添入任意Collection都可使用 add()方法。
Map保存的是键值对,(Map也被称作关联数组)使用方法put()为Map添加元素,它需要一个键与一个值作为参数。
Java容器的“缺点”,在将对象加入容器的时候就丢失了类型信息。容器只保存Object型的引用,这是所有类的基类,因此容器可以保存任何类型的对象。
将ArrayList看作是“能够自动扩展的数组”。
迭代器是一个对象,它的工作是遍历并选择序列中的对象。
1. 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
2. 使用next()获得序列中的下一个元素。
3. 使用hasNext()检查序列中是否还有元素。
4. 使用remove()将上一次返回的元素从迭代器中移除。
点线方框表示接口,虚线方框表示抽象类,实线方框表示普通的(具体的)类。点线箭头代表特定的类实现一个接口(若是抽象类,则表示部分实现了接口)。实线箭头表示一个类可以生成箭头所指向类的对象。
三种容器:Map,List和Set,它们各有两到三个实现版本。常用的容器用黑色粗线框表示。
与持有对象有关的接口是Collection,List,Set和Map。
接口的优美之处(或者说目的)在于,如果你决定改变当前的实现,只需要在创建的位置做些修改即可。
List x = new LinkedList();
List x = new ArrayList();
典型情况是你会生成一个“具体类”的对象,然后将它向上转型为对应的接口,在代码中使用接口操作它。
Collection的功能方法:
可以通过Set或List执行的所有操作。
两种List:一种是基本的ArrayList,允许对元素进行快速随机访问,但是向 List 中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList,而不是用来插入和移除元素,因为那比LinkedList开销要大很多;另一种是更强大的LinkedList,对顺序访问进行了优化,向List中间插入与删除的开销并不大,随机访问则相对较慢。LinkedList 可以当作堆栈、队列和双向队列使用。
次序是List最重要的特点;它保证维护元素特定的顺序。一个List可以生成ListIterator,使用它可以从两个方向遍历List,也可以从List中间插入和移除元素。
Set具有与Collection完全一样的接口,实际上Set就是Collection,只是行为不同。存入Set 的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。
HashSet为快速查找设计的Set。存入HashSet的对象必须定义hashCode()。
Set需要维护元素的存储顺序,这意味着你必须实现Comparable接口,并且定义compareTo()方法。