如何区分Java中的集合类

作者在 2008-01-22 16:15:46 发布以下内容
        记得当初学集合类的时候,被那么多的接口搞得晕头转向的,刚开始根本就不清楚他们的区别以及如何使用他们。现在回过头来看看,发现比以前清晰了,这里简单说下。
        首先为什么有集合类?数组大家肯定都知道是干嘛的。Java里面,数组的长度是不能改变的,也就是说,如果在初始化一个数组的时候,它的长度是确定了的,那么以后就再也不能改变了。有时候这会带来不便,也许你要运行之后才能知道实际需要的数组长度呢?因此便有了Java的集合类。
        这里先分清楚Collection和Collections的区别。Collection(没有"s")是指一组接口,里面声明了一些方法;而Collections(有"s")才是Java中的集合类,有具体方法的定义。
        还有一个重要的性质就是排序和自然顺序。这是两个完全不同的概念。一些英文教材以ordered和sorted来区分这两个概念。一个集合类中的元素,可以是ordered和sorted的,可以是not ordered和not sorted的,可以是ordered和not sorted的,但是绝不可能是sorted而not ordered的,因为sorted是ordered的一种特殊情况。一般而言,ordered是指元素插入集合类的先后顺序,例如插入一个ArrayList,顺序是其插入的下标。而sorted一般是按照自然顺序,举个例子,插入几个String类型的对象,其自然顺序就是字母的升序,A在B前面,B在C前面,不管你是否按照ABC的顺序插入的。但是如果你自己写了Comparator则自然顺序会按照这个来改变。Java的集合类中有两个是sorted的,一个是TreeSet,另一个是TreeMap。
        先说List, Set和Map接口。其中,List和Set是继承自Collection接口,而Map则不是。List可以说是一个动态数组,与Array不同的就是长度可以改变,允许有重复值。而Set与List有相似之处,最大的不同就是Set里面不允许有重复值。他们都可以存放Object对象,也就是说,如果想存放基本数据类型的值的话,必须使用它们的包装类。Map没有继承Collection接口,它里面存放的是键/值对,不允许有重复的键,但是允许有重复的值。
        然后是几个常用的集合类,这些类都各自实现了上面三个接口的方法,例如,ArrayList和LinkedList实现了List接口;HashSet,LinkedHashSet和TreeSet实现了Set接口;而HashMap,LinkedHashMap和TreeMap实现了Map接口。
        ArrayList是比较常用的一个类了。当成一个长度可以改变的数组来用。这是一个按照元素下标来排序的。而LinkedList与ArrayList相似,也是按照下标排序。不同的是元素彼此之间有联系。检索速度比ArrayList慢,但是说到添加或删除元素的话表现要比ArrayList好。
        HashSet是一个not ordered和not sorted的集合类,利用对象的hash code。注意,再使用iterator遍历HashSet中的元素时经常会得到没有固定顺序的结果。LinkedHashSet则是一个ordered的HashSet,排序是按照元素的插入顺序,也可以是按照最后访问的顺序,其余则与HashSet相似。而TreeSet则是一个sorted的集合类,按照元素的自然顺序排序,例如插入的String对象就按照字母升序排列。可以通过对象类实现Comparator接口来改变这个自然顺序。
        HashMap是一个not ordered和not sorted的集合类,以键/值对存放对象。LinkedHashMap则是ordered的HashMap,按照元素插入顺序排序。添加和删除元素方面比HashMap要慢,但是遍历则比它快。TreeMap则是另一个sorted的集合类,允许你写自己的comparison rule来改变自然顺序。
        强调一下,List关心的是下标,Set关心的是没有重复元素,Map关心的是没有重复键。综上,大家可以决定何时使用合适的集合类。
Java | 阅读 2984 次
文章评论,共0条
游客请输入验证码