Java编程思想之持有对象

1.     通过使用泛型,就可以在编译期防止将错误类型的对象放置到容器中。当指定了某类型作为泛型参数时,不仅此类型的对象可以放置到容器中,通过向上转型也可以把子类对象放进去。

2.     Java容器类类库的主要作用是保存对象。容器不能持有基本类型。

1)     Collection: 一个独立元素的序列,一种存放一组对象的方式。List必须按照插入顺序保存元素,Set不能有重复元素,Queue按照排队规则来确定对象产生顺序。

2)     Map: 一组成对的“键值对”对象,允许用键来查找值。ArrayList将数字和对象关联到了一起。映射表或者字典允许使用某个对象来查找另一个对象。

3.     添加一组元素: Arrays.asList()和Collections.addAll(),以及Collection对象.addAll()。List<A>与List<? Extends A>没有继承关系。可以用Array.<类型>asList()语法来显示类型参数说明。

4.     List接口在Collection继承上添加了大量的方法使得可以在List中间插入和移除元素。

1)     ArrayList:长于随机访问元素,但在List中间插入和移除元素较慢。

2)     LinkedList:在List中间插入和移除元素代价较低,提供了优化的插入顺序访问,但在随机访问方面较慢。

3)     对于在List中进行查找相关操作的元素来说,一般通过equal()方法来确定该元素的存在。

5.     迭代器是一个对象,工作是遍历并选择序列中的对象。由于Collection实现了Iterator()方法,因此实现了Collection类的类都可以通过这个方法转成迭代器。迭代器包括:方法iterator(), next(), hasNext()和remove()。迭代器统一了对容器的访问方式。

6.     ListIterator是Iterator的子类型,只能用于各种List类的访问,但可以双向移动,产生当前位置的前一个和后一个元素的索引。通过调用listIterator()方法来产生一个指向List开始处的ListIterator。

7.     LinkList可以用作栈、队列或双端队列的方法,通过把LinkList作为类的组合元素的形式。

8.     Set不保存重复的元素,这就要求判断元素相同的条件,即需要比较器。HashSet使用散列函数,查找速度快,但却没有任何元素存储顺序。TreeSet则把元素放在红黑树数据结构中,按照元素大小进行排列。LinkedHashList也使用了散列,查找速度快,但使用了链表来维护元素的插入顺序。

9.     Map将对象映射到其他对象上去。值可以是Map也可以是其他容器。HashMap,TreeMap,LinkedHashMap.

10.  队列是一种先进先出的容器,常被当作一种可靠的将对象从程序的某个区域传输到另一个区域的途径。LinkedList实现了Queue接口。具有offer(), peek()和poll()方法。

11.  优先级队列PriorityQueue声明下一个弹出的元素是最高优先级的元素。当插入元素时,默认的排序是使用对象在队列中的自然排序,也可以通过自定义的Comparator(构造器的第二个参数)来修改这个顺序。所以对于自己定义的类来说,必须定义了Comparator来能使用优先级队列存储自定义的类。

12.  Collection描述了所有序列容器的共性,Collection实现了Iteratable接口的iterator()方法。

13.  对于要使用到迭代器特性来说,首先考虑只实现iterator()方法,如果不行,就考虑继承AbstratCollection,如果还是不行,考虑实现Collection接口。对于继承了其他类的类来说,实现iterator()方法的方法代价最小。

14.  数组和Iterator接口可以在foreach使用,Iterator接口主要因为iterator()方法,可以被foreach用来在序列中移动。不存在数组到Iterator的自动转换。

15.  对于双向移动列表的需求来说,一般使用适配器方法,因为必须提供特定接口以满足foreach语句。如果希望在默认的前向迭代器的基础上,添加反向迭代器的能力,不能使用覆盖,而是添加一个能能够产生Iterator反向对象的方法。

16.  对于ArrayList<>(Arrays.asList(S)),打乱ArrayList的引用顺序不影响S数组的顺序。Arrays.asList()产生的List对象会使用底层数组作为其物理实现,所以如果Arrays.asList()产生的List被打乱了,那么会修改S的顺序。

17.  Java编程思想之持有对象