JAVA基础——List、Set和Map大讨论

        今天,我们来讨论一下我们经常使用的集合类,虽然是常用的,但是我相信还是有很多猿们还是再滥用,所以,今天普及一下。

首先看张图片:

        从Collection开始吧,Collection是一个接口,它包含ListSet两个子接口(Quene这里不讨论了),我们今天主要讨论一下:ListSetMap

        List是实现了Collection接口的接口,实现类:LinkedList、ArrayList、Vector

        Set是实现了Collection接口的接口,实现类:HashSet、TreeSet、LinkedSet

        Map是接口,实现类:HashMap、Hashtable、TreeMap、LinkedHashMap、WeakHashMap、IdentityHashMap

 

        Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。

 

        ListSetMap接口的不同:

        List存放的是单个元素,元素是可重复的,可以存放Null元素。

        Set存放的是单个元素,元素不可重复

        Map存放的是键值对,key是不可重复的,value是可重复的;键值都可以是Null,但是key只能有一个Null

 

下面说说这个三个接口的常用实现类:

        List

        Vector:

        基于数组(Array)的List,是线程同步的(sychronized)的

        ArrayList:

        Vector一样是一个基于数组上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。

        LinkedList:

        LinkedList不同于前面两种List,它不是基于数组的,所以不受数组性能的限制。它每一个节点(Node)都包含两方面的内容:

        1.节点本身的数据(data);

        2.下一个节点的信息(nextNode)。

        所以当对LinkedList做添加删除动作的时候就不用像基于数组的ArrayList一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了,这是LinkedList的优势。

        Set

        HashSet

        虽然SetList都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在 HashMap的基础上来实现的,这个就是SetList的根本区别。

        HashSet的存储方式是把HashMap中的Key作为Set的对应存储项,这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMapkey是不能有重复的。

         LinkedHashSet

        HashSet的一个子类,一个链表。

        TreeSet

        不同于HashSet的根本就是TreeSet是有序的它是通过SortedMap来实现的。

        Map

        HashMap

        用到了哈希码的算法,以便快速查找一个键和它对应的值。

        TreeMap

        是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。

         当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。

 

        至此,我们给出了常用集合类的优缺点,有的时候,就是这些小小的知识点就把你系统的性能打了很大的折扣。我们在使用上稍稍注意,对系统就是一次拯救!


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值