第11章:持有对象

记录《Thinking In Java》学习过程中的一些总结。

数组

数组将数字与对象联系起来。它保存类型明确的对象,查询对象时,不需要对结果做类型转换,它可以是多维的,可以保存基本类型的数据。数组一旦生成,容量不可以改变

容器类基本类型

Collection:一个独立元素的序列

Set:不能有重复元素.Set(除了TreeSet)与Collection具有完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同(这是继承和多态思想的典型应用)

List:必须按照插入的顺序保存元素

Queue:按照排队规则来确定对象产生的顺序。各种Queue和栈的行为,由LinkedList提供支持。

Map:允许你将某些对象与其他一些对象关联起来的关联数组 。一组成对的“键值对”对象。

Map与Collection的唯一重叠是Map可以使用entrySet(){}和values()方法来产生Collection。

values():方法是获取集合中的所有的值----没有键,没有对应关系。

KeySet():将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。 keySet():迭代后只能通过get()取key 

entrySet():Set> entrySet() //返回此映射中包含的映射关系的 Set 视图。 Map.Entry表示映射关系。entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口 。

总结

① 如果涉及到堆栈,队列等操作,应该考虑用List。如果要进行大量的随机访问,应使用ArrayList;如果经常进行插入与删除操作,用使用LinkedList。

② HashMap设计用来快速访问;而TreeMap保持“键”始终处于排序状态,所以没有HashMap快。LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力。

③ Set不接受重复元素。HashSet提供最快的查询速度,而TreeSet保持元素处于排序状态。LinkedHashSet以插入顺序保存元素。

④ 对哈希表的操作,作为key的对象要正确重写equals和hashCode方法。

⑤ 尽量返回接口而非实际的类型(针对抽象编程),如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。

⑥ 程序中不应该使用过时的Vector\Hashtable\Stack。(

如果需要考虑线程安全,应该使用ConcurrentMap,CopyOnWriteArrayList,CopyOnWriteArraySet

)

一些数据类型的比较

ArrayList和LinkedList

都是LIst类型,从输出可以看到,都按照被插入的顺序保存元素。

ArrayList:长于随机访问元素,但是在List中间插入和移动元素较慢

LinkedList:通过代价较低的在List中间进行插入和删除操作,提供了优化的顺序访问。在随机访问方面比较慢,但是特性集较ArrayList更大(比如添加了使其用作栈、队列或双端队列的一些方法)

HashSet、TreeSet和LinkedHashSet

HashSet:存储无序。使用散列函数

TreeSet:按照比较结果的升序存储。使用红黑树数据结构存储元素。

LinkedHashSet:按照被添加的顺序保存对象。因为查询速度的原因也使用了散列,但是看起来它使用了链表来维护元素的插入顺序。

迭代器(Iterator)

轻量级对象,java中的迭代器只能单向移动。

将遍历序列的操作与序列底层的结构分离,统一了对容器的访问方式。

接口

使用接口描述的一个理由是它可以使我们能够创建更通用的代码。通过针对接口而非具体实现来编写代码,我们的代码可以应用于更多的对象类型。

你可能感兴趣的:(第11章:持有对象)