JAVA基础-集合

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 set = new HashSet<>(list);
//Set转List
List 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基础-集合)