集合框架总结-序

版权声明:欢迎转载 转载请声明出处 https://blog.csdn.net/Surrin1999/article/details/82079242

集合框架初步学习后,打算写下此系列文章总结

本文只做总的概述,不对某个集合进行详细解析

详细解析请移步同系列其他文章

ArrayList部分源码解析    

HashMap部分源码及疑难问题解析

Java Map遍历方式的选——TreeMap、HashMap的key、value遍历与效率分析


目录

集合框架体系

如何选择集合的使用


  • 集合框架体系

(图源传智播客 侵删)

Collection(单列集合)
        |--List    有序,可重复
            |--ArrayList
                底层数据结构是数组,查询快,增删慢。
                线程不安全,效率高
            |--Vector
                底层数据结构是数组,查询快,增删慢。
                线程安全,效率低
            |--LinkedList
                底层数据结构是链表,查询慢,增删快。
                线程不安全,效率高
        |--Set    无序,唯一 (只能用迭代器 没有了get方法)
            |--HashSet
                底层数据结构是哈希表
                如何保证元素唯一性
                    依赖两个方法:hashCode()和equals()
                    开发中自动生成这两个方法即可
                |--LinkedHashSet
                    底层数据结构是链表和哈希表
                    由链表保证元素有序       (存储与取出顺序一致)
                    由哈希表保证元素唯一
            |--TreeSet
                底层数据结构是红黑树
                如何保证元素排序
                    自然排序        泛型重写实现Comparable接口 重写compare(T o1, T o2)方法
                    比较器排序    构造函数实现Comparator接口 重写CompareTo(T o)方法
                如何保证元素唯一性
                    根据比较的返回值是否是0来决定

Map(双列集合)     

            |--HashMap

                底层数据结构是哈希表(数组+链表)和红黑树    PS:JDK8之前只是哈希表 没有红黑树 JDK8中红黑树也只是作为补充

                由哈希表保证键唯一  注意只是键唯一 值并不唯一

                元素以键值对方式存储,通过键可以映射到值  习惯上将HashMap<K,V>的对象称为散列映射

                    |--LinkedHashMap

                       底层数据结构是哈希表+链表

                       由哈希表保证键唯一  链表保证元素有序    (存储与取出顺序一致)

                       元素以键值对方式存储,通过键可以映射到值

            |--TreeMap

                底层数据结构是哈希表(数组+链表)和红黑树  

                由哈希表保证键唯一   红黑树实现排序           


  • 如何选择集合的使用

           集合框架体系庞大,要想合理的使用集合必须先了解集合的特点,而各自的特点其实通过集合的名字就已经可以了解大概

  •     ArrayXxx:底层数据结构是数组,查询快,增删慢
  •     LinkedXxx:底层数据结构是链表,查询慢,增删快
  •     HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()
  •     TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

           通过命名规律,我们便可以在特定的场景选择合适的集合了

           当难以判断用Collection体系还是Map体系时  用Collection体系          

Collection

唯一吗?

        是:Set

            排序吗?

                是:TreeSet

                否:HashSet 

                要存储与取出顺序一致: LinkedHashSet

如果你知道是Set,但是不知道是哪个Set,就用HashSet 

            

        否:List

            要线程安全吗?

                是:Vector

                否:ArrayList或者LinkedList

                    查询多:ArrayList

                    增删多:LinkedList

如果你知道是List,但是不知道是哪个List,就用ArrayList

如果需要以键值对方式存储对象 则使用Map体系

Map

           要线程安全吗?

                是:Hashtable(注意! Hashtable不属于Map体系 只是用法相似  其继承自java.util.Dictionary<K,V>)

                否:   HashMap/TreeMap

                               要排序吗?

                                         是:TreeMap

                                         否:   HashMap

                                                      要存储与取出顺序顺序一致:  LinkedHashMap

如果你知道是Map,但不知道用哪个Map,就用HashMap

一般情况下,用ArrayList足以应对大多数情况了,因为我们可以使用Collections工具来对集合进行进一步操作

  •    public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
  •    public static <T> void sort(List<T> list,Comparator<? super T> c):   使用比较器指定的排序方式进行排序
  •    public static <T> int binarySearch(List<?> list,T key):二分查找
  •    public static <T> T max(Collection<?> coll):最大值 
  •    public static void reverse(List<?> list):反转
  •    public static void shuffle(List<?> list):随机置换
  •    public static <T> List<T> synchronizedList(List<T> list):返回由指定列表支持的同步(线程安全)列表

值的一提的是 使用 synchronizedList方法返回的线程安全集合,并对其迭代时要加上同步锁 否则可能会有不可预料的结果

以下源自API

          在迭代时,用户必须在返回的列表上手动同步: 
          
            List list = Collections.synchronizedList(new ArrayList());
                ...
             synchronized (list) {
                Iterator i = list.iterator(); // Must be in synchronized block
                while (i.hasNext())
                    foo(i.next());
             }                                

猜你喜欢

转载自blog.csdn.net/Surrin1999/article/details/82079242