Java Container的分类图见附件1,简化分类图见附件2。
Container分类简介:
Container包括Collection和Map两种分类,其中Collection用来保存单个的Objects,Map以Key-Value的形式来保存Objects。Collection包括List和Set两种,List接口包括两个基本的实现类ArrayList和LinkedList。ArrayList允许随机的快速访问其中元素,但是Insert和Remove速度较慢;LinkedList访问其中元素的速度较慢,但是Insert和Remove相对于ArrayList来说较快。Set接口不允许其中有相等的元素(List允许duplicate elements),其包括两个基本的实现类HashSet和TreeSet。HashTable支持快速的查找元素(要求元素支持hashCode方法),其中的元素随机保存;TreeSet以一定的顺序保存元素,它实现SortedSet接口,均可以返回Comparator接口来确定其排序算法,元素通过实现Comparable接口来确定其间的顺序。Map接口以key-value的形式保存元素,Map中的key都是unique的,其包括两个实现类HashMap和TreeMap。HashMap是HashTable的替代品,它提供定时间的插入和查找元素;TreeMap中的key sets是以一定的顺序保存的,这和TreeSet是类似的,也可以返回Comparator接口来确定其key set的排序算法。
HashCode的作用:
HashCode是为了在HashSet里面更快的查找元素。HashSet在填充元素时候,会对object的hashcode进行一些归类处理,生成一系列的buckets(一般是能够控制在一定范围的)。然后把bucket作为数组的索引,每个数组元素保存一个List,将所有在此bucket内的元素填充入该List当中。当查找元素时候,只需要先根据元素的hashcode找到相应的索引,然后从索引指向的List当中依次查找该元素即可。设计hashcode需要考虑其的聚焦性,尽量减少hashcode的聚焦性,减少多个hashcode指向一个索引的情况,可以更好的提高HashSet的性能。
Iterator的说明:
Iterator是为Contanier提供了一个按照顺序依次取出Container元素的类。Iterator隐藏了取出元素机制和低层结构,程序员不需要知道低层到底是List还是Set还是Map,就可以从其中按照顺序取出元素。也正是因为如此,Iterator只提供了按单方向顺序取出元素。
工具类的说明:
Collections封装了一些常用的方法。包括对List的排序,取其中最大最小元素等等...
如何根据需求选择不同的实现类:
首先,Hashtable,Vector,Stack已经不被推荐使用,保留它们只是为了使遗留系统的代码不被破坏。所以这三个类可以忽略考虑。当使用List的时候,最好的方法是把ArrayList作为Default选择,当发现需要大量的Insertions和removals需求时改换LinkedList;使用Set的时候,如果需要有顺序的查找和取出元素,那么选择TreeSet,否则选择HashSet;使用Map的时候,HashMap用来更快的查找元素,而TreeMap允许按照一定顺序来根据key查找元素。
Container分类简介:
Container包括Collection和Map两种分类,其中Collection用来保存单个的Objects,Map以Key-Value的形式来保存Objects。Collection包括List和Set两种,List接口包括两个基本的实现类ArrayList和LinkedList。ArrayList允许随机的快速访问其中元素,但是Insert和Remove速度较慢;LinkedList访问其中元素的速度较慢,但是Insert和Remove相对于ArrayList来说较快。Set接口不允许其中有相等的元素(List允许duplicate elements),其包括两个基本的实现类HashSet和TreeSet。HashTable支持快速的查找元素(要求元素支持hashCode方法),其中的元素随机保存;TreeSet以一定的顺序保存元素,它实现SortedSet接口,均可以返回Comparator接口来确定其排序算法,元素通过实现Comparable接口来确定其间的顺序。Map接口以key-value的形式保存元素,Map中的key都是unique的,其包括两个实现类HashMap和TreeMap。HashMap是HashTable的替代品,它提供定时间的插入和查找元素;TreeMap中的key sets是以一定的顺序保存的,这和TreeSet是类似的,也可以返回Comparator接口来确定其key set的排序算法。
HashCode的作用:
HashCode是为了在HashSet里面更快的查找元素。HashSet在填充元素时候,会对object的hashcode进行一些归类处理,生成一系列的buckets(一般是能够控制在一定范围的)。然后把bucket作为数组的索引,每个数组元素保存一个List,将所有在此bucket内的元素填充入该List当中。当查找元素时候,只需要先根据元素的hashcode找到相应的索引,然后从索引指向的List当中依次查找该元素即可。设计hashcode需要考虑其的聚焦性,尽量减少hashcode的聚焦性,减少多个hashcode指向一个索引的情况,可以更好的提高HashSet的性能。
Iterator的说明:
Iterator是为Contanier提供了一个按照顺序依次取出Container元素的类。Iterator隐藏了取出元素机制和低层结构,程序员不需要知道低层到底是List还是Set还是Map,就可以从其中按照顺序取出元素。也正是因为如此,Iterator只提供了按单方向顺序取出元素。
工具类的说明:
Collections封装了一些常用的方法。包括对List的排序,取其中最大最小元素等等...
如何根据需求选择不同的实现类:
首先,Hashtable,Vector,Stack已经不被推荐使用,保留它们只是为了使遗留系统的代码不被破坏。所以这三个类可以忽略考虑。当使用List的时候,最好的方法是把ArrayList作为Default选择,当发现需要大量的Insertions和removals需求时改换LinkedList;使用Set的时候,如果需要有顺序的查找和取出元素,那么选择TreeSet,否则选择HashSet;使用Map的时候,HashMap用来更快的查找元素,而TreeMap允许按照一定顺序来根据key查找元素。