对象的集合

需要在任意时刻,任意位置,创建任意数量的对象。

1. 数组:数组同其它种类的容器之间的区别:效率、类型和持有基本类型的能力。考虑到效率与类型检查,应该尽可能使用数组,解决一般化问题,数组很受限制。

2. 数组是第一级对象:数组标识符其实只是一个引用,指向在堆(heap)中创建的一个真实对象,这个(数组)对象用以保存指向其他对象的引用。对象数组保存的事引用,基本类型直接保存基本类型的值。

3. 基本类型的容器:与包装过的基本类型的容器相比,,创建与访问一个基本类型的数组效率更高。

4. Arrays类:它中的static方法,equals(),比较两个数组是否相等;fill(),用某个值填充整个数组;sort(),对数组排序,还有binarySearch(),在已经排序的数组中查找元素。

5. 填充数组:Arrays.fill()可以填充整个数组,或者填充数组的某个区域,但只能单个值来填充。

6. 复制数组:System.arraycopy(),需要的参数有:源数组、表示从源数组中的什么位置开始复制的偏移量、表示从目标数组的什么位置开始复制的偏移量、以及需要复制的元素个数。

复制对象数组,只是复制了引用,不会出现两份对象的拷贝。被称作浅复制(shallow copy).

7. 数组的比较:数组相等是基于内容的。条件是元素个数必须相等,对应位置的元素也相等。

8. 数组元素的比较:使用回调技术(callback),通过使用回调,将会发生变化的代码分离出来,然后由不会发生变化的代码回头调用会发生变化的代码。

使用java.lang.Comparable接口中的compareTo()方法来比较

使用策略模式,将会发生变化的代码包装在类中(即所谓策略对象),将策略对象交给保持不变的代码,后者使用此策略实现它的算法。

9. 数组排序:使用内置的排序方法,对任意的对象数组进行排序,需要该对象实现了Comparable接口或相关联的Comparator。

Java标准库中的排序算法为各种类型作了优化——针对基本类型设计的“快速排序(quicksort)”,以及针对对象设计“稳定归并排序(stable merge sort)”

10. 在已排序的数组中查找:arrays.binarySearch()对排好序的数组进行快速查找。

11. 对数组的小结:java容器Set,每个对象只保存一份,Map是一种关联性数组,所有容器都能自动调整容量。

12. 容器的打印:默认的打印使用容器提供的tostring()方法,数组则不能。Collection打印出来的用方括号括住,每个元素用逗号分隔。Map则用大括号括住,键与值由等号联系。(键在等号左边,值在右边)。Set每个对象只保存一次,并使用自己的内部排序方法。

13. 填充容器:Collections有个static方法,有fill()方法,是用同一份对象的引用来填充容器的,并只对List对象有用,而对Set或Map并不起作用。

14. 容器的缺点:未知类型,容器只知道它保存的是Object类型的引用,在使用容器中的元素前必须要做类型转换操作。

可通过组合(composition),使用ArrayList类,来写自己的List类,进行List只能使用单一类型的控制。

15. 迭代器:使用迭代器Iterator。若想打印对象的地址,应调用Object的toString()方法。可使用super.toString()取代this。

16. 容器的分类法:List、set、map三种。所有的Collection都能通过iterator()方法生成Iterator.

17. collection的功能方法:(Map不是继承自Collection。)其中不包括随机访问所选择元素的get()方法。因为Collection包括Set,而Set是自己维护内部顺序的。

18. 使用LinkedList制作一个栈和队列。

19. Set的功能方法:set不保存重复的元素。加入Set的元素必须定义equals方法,来确保对象的唯一性。加入HashSet的对象必须定义hashcode().(TreeSet采用红黑树的数据结构排序元素,HashSet则采用散列函数。

20. sortedSet:TreeSet是其的唯一实现,可以确保元素处于排序状态,还可以使用Sorted接口提供的附加功能。sortedSet的意思是“按比较函数对元素排序”,而不是指“元素插入的次序”。

21. Map的功能方法:所有的容器只能保存对Object的引用。

22. SortedMap:(TreeMap是其唯一的实现),确保“键”处于排序状态。

23. LinkedHashMap:“键值对”是以插入的顺序进行遍历的。

24. 散列算法与散列码:Object.equals()只是比较对象的地址。要使用自己的类作为HashMap的“键”,你必须同时重载hashcode()和equals()。

25. 理解Hashcode():散列的价值在于速度:散列使得查询得以快速进行。由于速度的瓶颈是对“键”的查询,因此解决方案之一是保持“键”的排序状态。

26. HashMap的性能因子:容量(Capacity),初始化容量(Initial capacity),尺寸(Size),负载因子(Load factor),HashMap默认的负载因子为0.75.

27. 重载hashCode():它必须速度快,并且必须有意义。也就是说,它必须基于对象的内容生成散列码。通过hashCode()和equals(),必须能够完全确定对象的身份。

28. 持有引用:三个继承自抽象类Reference的类,SoftReference、WeakReference、PhantomReference。ReferenceQueue,用于“回收清理工作”的工具,而PhantomReference只能依赖于ReferenceQueue。

29. WeakHashMap:用来保存WeakReference。允许垃圾回收期自动清理“键”和“值”。

30. 重访迭代器:Iterator,将遍历一个序列的操作与此序列底层结构相分离的能力。

31. 选择接口的不同实现:

对List的选择:vector避免使用,将ArrayList作为默认首选,必要时,选择LinkedList。

对Set的选择:HashSet的性能总是比TreeSet好(添加和查询元素),TreeSet维持元素的排序状态。对于插入操作,LinkedHashSet比HashSet略微慢一点,因为要维护链表,遍历LinkedHashSet会更快。

对Map的选择:首选HashMap,需要排好序的,使用TreeMap。

32. Collection或Map的同步,调用Collections的类方法。

33. 快速报错(fail fast)java容器类库采用“快速报错”机制,探查容器的任何变化。当它发现其他进程修改了容器,会立刻抛出ConcurrentModificationException异常。

34. 未获支持的操作:使用Arrays.asList(),能够将数组专程成List。实现Collection和List接口,调用其他方法时导致了UnsupportedOperationException异常。

35. BitSet:高效率地存储大量“开——关”的信息,最小容量是long,64bit.

 

 

 

——————————如果不豁出性命的话,也是无法开创未来的。