记录《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中的迭代器只能单向移动。
将遍历序列的操作与序列底层的结构分离,统一了对容器的访问方式。
接口
使用接口描述的一个理由是它可以使我们能够创建更通用的代码。通过针对接口而非具体实现来编写代码,我们的代码可以应用于更多的对象类型。
网友评论