Java集合类简要总结打赏

java集合类主要负责保存、盛装其他数据,因此集合类也称容器类。java集合类分为:set、list、map、queue四大体系。其中set代表无序、不可重复的集合;list代表有序、可重复的集合。map代表具有映射关系的集合;queue代表队列集合。

java集合类主要由两个接口派生:Collection和Map,是集合框架的根接口。下面是其接口、子接口和实现类的继承树。

下面就一一介绍四大接口及其实现类。

Set接口。set集合不允许包含相同的元素。set判断两个对象是否相同是根据equals方法。如果两个对象用equals方法返回的是true,set不会接受这两个对象。

HashSet是set接口的典型实现,HashSet按hash算法来存储集合中的元素。因此具有很好的存储和查找性能。HashSet判断两个元素的标准是两个元素的equals方法比较相等,同时两个对象的hasCode()方法返回值也相等。HashSet可以保存null元素。

List集合代表一个有序集合。集合中的每个元素都有其对应的顺序索引。Arraylist和vector是list接口的两个典型实现。他们之间的显著区别就是:vector是线性安全的,而arraylist不是。它们两个都是基于数组实现的list类。List还有一个基于链表实现的LinkedList类。当插入、删除元素的速度非常快。这个类比较特殊,功能也特别多,即实现了List接口,也实现了Dueue接口(双向队列)。可以当成双向队列使用,也可以当成栈使用。

Queue用于模拟队列的数据结构。LinkedList和ArrayDueue是其两个比较常用的实现类。

Map用于保存具有映射关系的数据。Map接口有如下几个常用的实现类:HashMap、HashTable、TreeMap。TreeMap是基于红黑树对TreeMap中所有key进行排序。HashMap和HashTable主要区别有两点:1、Hashtable是线性安全的,因此性能差些。2、HashMap可以使用null作为key或者value。

集合类还提供了一个工具类Collections。主要用于查找、替换、同步控制、设置不可变集合。

上面是对java集合类的一般概述,下面就set、list、map三者之间的关系进行剖析。

Set与Map的关系。Map集合中所有key集中起来,就组成了一个set集合。所以Map集合提供Set<K> keySet()方法返回所有key组成的set集合。由此可见,Map集合中的所有key具有set集合的特征,只要Map所有的key集中起来,它就是一个Set集合,这就实现了Map到Set的转换。同时,如果把Map中的元素看成key-value的set集合,也可以实现从Set到Map之间的转换。HashSet和HashMap分别作为它们的实现类。两者之间也挺相似的。HashSet的实现就是封装了HashMap对象来存储元素。它们的本质是一样的。类似于HashSet和HashMap的关系,其实TreeMap和TreeSet本质也差不多,TreeSet底层也是依赖TreeMap实现。

Map与List的关系。把Map的key-value分开来看,从另一个角度看,就可以把Map与List统一起来。

Map集合是一个关联数组,key可以组成Set集合,Map中的value可以重复,所以这些value可以组成一个List集合。但是需要注意的是,实质Map的values方法并未返回一个List集合。而是返回一个不存储元素的Collection集合,换一种角度来看对List集合,它也包含了两组值,其中一组就是虚拟的int类型的索引,另一组就是list集合元素,从这个意思上看,List就相当于所有key都是int型的Map。

下面讲解几个相似类之间的差异。

ArrayList和LinkedList。ArrayList是一种顺序存储的线性表,其底层是采用数组实现的,而LinkedList是链式存储的线性表。其本质就是一个双向链表。对于随机存储比较频繁的元素操作应选用ArrayList,对于经常需要增加、删除元素应该选用LinkedList。但总的来说ArrayList的总体性能还是优于LinkedList。

HashSet与HashMap的性能选项。主要有两个方面:容量和负载因子(尺寸/容量)。较低负载因子会增加查询数据的性能,但是会降低hash表所占的内存开销。较高负载因子则反之,一般对数据的查询比较频繁,所以一般情况下初始容量应该大一点,但也不能太大,否则浪费内存空间。

Java集合类简要总结
文章《Java集合类简要总结》二维码
  • 微信打赏
  • 支付宝打赏

已有13条评论

  1. 屁孩

    用的最多的就是ArrayList、HashMap,其他就很少了!

    2012-02-27 00:07 回复
    • 穷小子

      确实啊,你也是做java开发的?我新手,以后多指教哦。。

      2012-02-27 21:14 回复
      • 屁孩

        呵呵,这些年一直做Java,指教谈不上,互相交流吧!

        2012-02-28 09:13 回复
        • 穷小子

          呵呵,多多交流哈,你现在在哪工作呢?

          2012-02-28 10:47 回复
  2. 爱吧文学

    谢谢,不错哦!先收藏。

    2012-02-24 12:11 回复
  3. 武林之人

    哈哈,不错不错,总算找到了!

    2012-02-23 23:39 回复
  4. 刘学政博客

    怎奈我看不懂技术……

    2012-02-23 22:56 回复
  5. win8迷

    表示不懂java

    2012-02-23 21:43 回复
  6. 特色小吃

    没看懂,呵呵。

    2012-02-23 17:27 回复
  7. 女裤品牌

    干这个也有好千块一个月吧

    2012-02-22 14:40 回复
    • 穷小子

      差不多吧。现在还是基层学者,呵呵

      2012-02-22 21:15 回复
  8. 朱定聪

    0.0 不懂不懂~~

    2012-02-22 06:25 回复
    • 穷小子

      学了就懂了。。基础的东西,用来备忘而已

      2012-02-22 21:15 回复

(必填)

(必填)

(可选)