Thinking in Java学习笔记(六)

Posted on 2009-06-12 14:57 eric_xu 阅读(156) 评论(0)  编辑  收藏 所属分类: Java

对象的集合

数组

数组标识符其实只是一个引用,指向在堆(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。第一次调用Iteratornext()方法时,它返回序列的第一个元素。

2. 使用next()获得序列中的下一个元素。

3. 使用hasNext()检查序列中是否还有元素。

4. 使用remove()将上一次返回的元素从迭代器中移除。

container.jpg

点线方框表示接口,虚线方框表示抽象类,实线方框表示普通的(具体的)类。点线箭头代表特定的类实现一个接口(若是抽象类,则表示部分实现了接口)。实线箭头表示一个类可以生成箭头所指向类的对象。

三种容器:MapListSet,它们各有两到三个实现版本。常用的容器用黑色粗线框表示。

 

与持有对象有关的接口是CollectionListSetMap

接口的优美之处(或者说目的)在于,如果你决定改变当前的实现,只需要在创建的位置做些修改即可。

List x = new LinkedList();

List x = new ArrayList();

 

典型情况是你会生成一个“具体类”的对象,然后将它向上转型为对应的接口,在代码中使用接口操作它。

container simple.jpg.jpg

Collection的功能方法:

可以通过SetList执行的所有操作。

 

两种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()方法。

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 37, comments - 5, trackbacks - 0, articles - 0

Copyright © eric_xu