第8章 对象的容纳
1.数组
考虑到执行效率和类型检查,尽可能地采用数组。
2.集合
四种类型:Vector(矢量)、bitset(位集)、Stack(堆栈)、Hashtable(散列表)。
Hashtable是一种关联数组,允许我们将对象关联起来,集合类会自动改变自身的大小。
缺点是:将对象置入一个集合时丢失了类型信息,在使用的时候必须进行造型。
3.枚举器(反复器)
可以利用集合的某个方法(比如 elements()或者iterator())返回一个反复器(
枚举器),就可以利用反复器遍历集合,对于哪种集合都是适用的,不受集合类型限制。
4.java崩溃
public String toString() {
return "CrashJava address: " + this + "\n";
}
在使用上面的代码返回一个字符串的时候程序崩溃,因为this会调用方法toString(),
造成递归调用。
5.BitSet
由“二进制位”构成的的Vector,可以用在保存大量“开-关”信息,使用在高并发的场景。
不过应尽量避免使用BitSet,应为BitSet还不是很稳定,容易出现违例。
6.字典,映射,关联数组
Vector可以使用数字同对象关联起来,通过数字来选择对象,这种关系就是字典的概
念。也可以是通过对象来选择对象,具体反映到抽象类 Dictionary。
7.Hashtable(散列表)
通过散列码可以获取对象中的信息,然后将其转化成那个对象“相对惟一”的整数。
当自己创建类作为键使用时,必须同时覆盖hashCode()、equals()。
8.懒惰求值
除非绝对必要,否则不采取行动。懒惰初始化,除非真的需要一个字段值,否则不进
行初始化。
9.java通用库 (JGL)
可以免费试用,功能比自带的集合库更加强大,可以在 http://www.ObjectSpace.com下载
10.新集合
List必须按特定的顺序容纳元素,Set不可包含任何重复的元素。从书上截图下来的新集合
示意图:
11.Set
创建自己的类型的时候,一定要注意Set需要通过一种方式来维持一种存储顺序,实现comparable
接口。equals()、public int compareTo(Object o)
12.决定实施方案
1.先选择一个ArrayList作为默认起点,以后如果发现由于大量的插入和删除造成了性能降低,再考虑
换LinkedList。
2.决定用何种Set: 一般使用HashSet,用不着ArraySet。
3.决定用何种Map:首选HashMap
13.排序和搜索
用于排序和搜索数组的Arrays和用于排序和搜索列表的Collections。注意:在执行搜索之前
一定要调用sort(),避免发生不可预测的行为。通过实现Comparator接口,覆盖compare
方法,可以实现自定义的比较方法,这个方法在排序里面用到,但是使用sort()方法要指
定这个比较器。另一种是实现Comparable接口,覆盖compareTo方法。
14.使Collection或Map不可修改
将原始容器传递进入一个方法,并令其传回一个只读版本。
c = Collections.unmodifiableCollection(c);
a = Collections.unmodifiableList(a);
s = Collections.unmodifiableSet(s);
m = Collections.unmodifiableMap(m);
15.Collection或Map的同步
Collection c =
Collections.synchronizedCollection(
new ArrayList());
List list = Collections.synchronizedList(
new ArrayList());
Set s = Collections.synchronizedSet(
new HashSet());
Map m = Collections.synchronizedMap(
new HashMap());
总结
(1)数组和Vector都包含了对象的数字化索引,Vector能够自动改变自身大小,Vector只能容纳对象
句柄,而且将一个对象句柄从集合中取出来的时候,必须要进行造型。
(2)Hashtable 属于Dictionary的一种类型,将对象同其他对象关联到一起的方式。
(3)Stack是一种后入先出的队列。
(4)总的来说,这章学习了容纳对象的容器,主要是容器的特征不一样,应用的地方也不一样。选择
的时候应该考虑到执行的效率问题,能用数组最好用数组,然后再考虑新的集合。