《Thinking in java》-学习笔记(8)

第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可以使用数字同对象关联起来,通过数字来选择对象,这种关系就是字典的概

扫描二维码关注公众号,回复: 2657613 查看本文章

念。也可以是通过对象来选择对象,具体反映到抽象类 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)总的来说,这章学习了容纳对象的容器,主要是容器的特征不一样,应用的地方也不一样。选择

的时候应该考虑到执行的效率问题,能用数组最好用数组,然后再考虑新的集合。

猜你喜欢

转载自blog.csdn.net/a614528195/article/details/81149138