美文网首页
JAVA基础-集合

JAVA基础-集合

作者: 啊啰哈嘿呀 | 来源:发表于2021-02-09 15:52 被阅读0次

    JAVA基础-集合

    1.概述

    JAVA容器分为两大类:
    Collection接口的子接口包括:List接口和Set接口;List接口实现类主要有ArrayList、LienkedList、Vector等;Set接口的主要实现类有HashSet、TreeSet、LinkedHashSet等;
    Map接口的实现类主要有HashMap、TreeMap、Hashtable、ConcurrentHashMap等;

    • Collection
      List
        ArrayList
        LinkedList
        Vector
      Set
        HashSet
          LinkedHashSet
        TreeSet
    • Map
      HashMap
        LinkedHashMap
      TreeMap
      ConccurrentHashMap
      Hashtable

    2.List和Set的异同

    • List接口:List是有序的Collection,保持了每个元素插入的顺序,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素;
    • Set接口:Set 不保存重复的元素。Set 接口存储一组唯一,无序的对象。
    允许重复对象 null元素 是否有序 常见实现类
    List 允许多个null元素 ArrayList LinkedList Vector
    Set 允许插入一个null元素 HashSet LinkedHashSet TreeSet

    两个接口都是继承自Collection,是常用来存放数据项的集合,主要区别如下:

    ① List和Set之间很重要的一个区别是是否允许重复元素的存在,在List中允许插入重复的元素,而在Set中不允许重复元素存在。

    ② 与元素先后存放顺序有关,List是有序集合,会保留元素插入时的顺序,Set是无序集合。

    ③ List可以通过下标来访问,而Set不能。
    List和Set可以相互转化:

    //List转Set
    Set<String> set = new HashSet<>(list);
    //Set转List
    List<String> list1 = new ArrayList<>(set);
    

    3. List接口常用实现类

    ArrayList、Vector和LinkedList类均在java.util包下;ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间来存储,因为数据存储是连续的,所以它们支持用下标来访问元素,索引数据的速度比较快。LinkedList是采用双向列表来实现的,对数据的索引需要从列表头开始遍历,因此用于随机访问则效率比较低,但是插入元素时不需要对数据进行移动,因此插入效率较高。同时,LinkedList是非线程安全的容器。

    数据结构 并发安全 扩容机制
    ArrayList 数组 非线程安全 自动增长原数组的0.5倍
    Vector 数组 线程安全 增长为原数组的1倍
    LinkedList 双向链表 非线程安全

    4.Set接口常用实现类

    HashSet: 无序
    LinkedHashSet: 按照插入顺序
    TreeSet: 从小到大排序

    • (1)HashSet
      HashSet有以下特点
       - 不能保证元素的排列顺序,顺序有可能发生变化
       - 不是同步的
       - 集合元素可以是null,但只能放入一个null

    • (2)TreeSet
      TreeSet类型是J2SE中唯一可实现自动排序的类型

      TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向 TreeSet中加入的应该是同一个类的对象。

    • (3)LinkedHashSet
      LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺 序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
      LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

    4.List和Map的区别

    • List是存储单列的集合

    • Map存储的是key-value键值对的集合

    • List存储的数据是有序且可以重复的

    • Map中存储的数据是无序且key值不能重复

    5.Map接口常用实现类

    允许key/value为空 并发安全 排序
    HashMap 允许为空 非线程安全 无序
    LinkedHashMap 允许为空 非线程安全 保持插入时顺序
    TreeMap 允许为空 非线程安全 根据键排序,默认升序
    ConccurrentHashMap 不允许为空 线程安全 无序
    Hashtable 不允许为空 线程安全 无序
    • 1)HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为null,不允许多条记录的值为null。HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用Collections.synchronizedMap(HashMap map)方法使HashMap具有同步的能力。

    • 2)Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。

    • 3)LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。

    • 4)TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iteraor遍历TreeMap时,得到的记录是排过序的。TreeMap的键和值都不能为空。

    相关文章

      网友评论

          本文标题:JAVA基础-集合

          本文链接:https://www.haomeiwen.com/subject/sghcxltx.html