深入浅出JAVA集合

来源:互联网 发布:数据部分迁移方案 编辑:程序博客网 时间:2024/05/16 12:28

广义的说,数组也属于集合的一种,但是我们在本文中并不打算讲数组,但是我们需要知道数组和其他集合的区别,区别在于:

数组可以存储基本数据类型和对象引用类型。

其他集合(继承于Collection,Map)不能储存基本数据类型(但是可以储存基本数据类型的包装类型,如Integer等)。

上面的图看起来很复杂,其实只需要理解几个知识点:

(1)Java集合的框架大致可分为两类,一类是Collection,另一类是Map。

出于基于接口编程的目的,Colletion和Map都被设计为接口,Colletion接口实现了Iterator接口,即迭代器接口,这意味着Colletion接口的实现类可以调用Iterator接口的方法实现迭代器行为。更重要的是,实现Colletion和Map的不同之处在于,Colletion类集合储存单个对象,Map类集合储存对象的键值对。

(2)Java开发环境还提供了Colletions,Arrays两个工具类,提供了诸如集合排序,数组和集合互相转换等使用方法。值得注意的是,这两个工具类的实现采用了面向接口编程(C++中也叫做泛型编程)。比如Collections的排序算法接受实现了Comparable接口的参数等,所以我们如果要使用工具类的排序方法时就必须让我们的对象实现此接口才行。

(3)Collection接口下又分为List接口和Set接口,List接口的实现类为ArrayList/LinkedList,主要特点是集合储存的元素可以重复。Set接口的实现类为HashSet/LinkedHashSet/TreeSet。

ArrayList可以理解为可变数组,特点是集合内部的元素有顺序排列,并提供类似于数组操作的下标访问(get方法)。此类集合的使用主要是随机顺序的访问。

Vector是老版Java的集合类型,和ArrayList类似,不同之处是该集合是同步的。

LinkedList是基于双向链表实现的,具有双向链表的特点,比如提供了addFirst,addLast,getFirst,getLast等方法。此类集合的使用主要是经常对集合内部元素的删除和增加。

HashSet是内部以哈希表算法排序的Set。HashSet类内部有一个HashMap对象,正是该对象来实现HashSet的排序。(原理大多同HashMap)

LinkedHashSet同HashSet类似,不同之处是此集合有可预知的迭代顺序。

TreeSet是SortSet的实现类,可以保证集合内部元素的排序。排序的原理是根据储存对象的compareTo方法来进行比较排序(一般是升序)。所以加入TreeSet集合的对象元素要实现Comparable接口。

(4)Map接口下主要分为HashMap和TreeMap两种集合。同理,前者是以哈希表算法进行排序,而后者是实现了SortMap接口,所以同TreeMap一样,都是采用对象的compareTo方法来排序。

HashMap内部采用哈希表算法排序,从源码可以看出,HashMap类内部有一个List类型的数组,改数组的下标是插入HashMap的键值对的键的hashCode方法生产的int值,这也就是为什么hashcode方法和equals方法被提倡同时重写的原因。数组里储存的自然是HashMapEntry这样的键值对。这样就形成了键的hashcode值与键值对对应的关系,但是注意这并不是一一对应的关系,因为插入HashMap的键值对的键可以重复。所以HashMap的效率就和键的hashcode方法成正比,hashcode方法写的越好,HashMap效率越高。

另外,对于储存于HashMap的元素来说,Map提供了以键来索取值得操作,所以键在重写hashcode的同时最好也要重写equals方法(这样键才能匹配)。

TreeMap是另外一种Map的实现,它实现了sortMap接口,所以该集合内部是采用对象的compareTo排序,故插入集合的元素必须实现Comparable接口。同时,由于Map提供了以键索取值得操作,也必须重写equals方法。这里的equals和compareTo最好保持一致性,即equals和compareTo中的相等条件最好一致。

(5)Map类集合提供三中视图---键集,值集,键值映射关系集,并且,没有实现迭代器接口,所以不提供迭代操作。但是它的3种视图是Collection类型,提供迭代操作。


原创粉丝点击