List,Map,Set详解

概述

  • List,Map,Set都是接口,List和Set继承于collection接口,Map是独立接口
  • Set下有HashSet,LinkedHashSet,TreeSet
  • List下有ArrayList,Vector,LinkedList
  • Map下有Hashtable,LinkedHashMap,HashMap,TreeMap
  • Collection接口下还有个Queue接口,有PriorityQueue类

List,Map,Set详解_第1张图片

Collection接口

List有序,可重复

  • ArrayList
    优点:底层数据结构是数组,查询快,增删慢
    缺点:线程不安全,效率高
  • Vector
    优点:底层数据结构是数组,查询快,增删慢
    缺点:线程安全,效率低
  • Linkedlist
    优点:底层数据结构是链表,查询慢,增删快
    缺点:线程不安全,效率高

Set无序,唯一

  • HashSet
    底层数据结构是哈希表。(无序,唯一)
    如何来保证元素唯一性?
    依赖两个方法:hashCode()和equals()
  • LinkedHashSet
    底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
    由链表保证元素有序
    由哈希表保证元素唯一
  • TreeSet
    底层数据结构是红黑树。(唯一,有序)
    如何保证元素排序的呢?
    自然排序
    比较器排序
    如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

Collection根据情况选择使用

唯一吗?

    是:Set

        排序吗?

            是:TreeSet或LinkedHashSet
            否:HashSet
            如果你知道是Set,但是不知道是哪个Set,就用HashSet。

否:List

    要安全吗?

        是:Vector
        否:ArrayList或者LinkedList

            查询多:ArrayList
            增删多:LinkedList
            如果你知道是List,但是不知道是哪个List,就用ArrayList。

如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
如果你知道用集合,就用ArrayList。

Map接口

List,Map,Set详解_第2张图片

Map接口有三个重要的实现类

  • HashMap:无序,不同步,线程不安全,效率高,允许null值,父类AbstractMap。
  • HashTable:无序,同步,线程安全,效率低,不允许null值,父类Dictionary。
  • TreeMap:有序

TreeSet, LinkedHashSet and HashSet 的区别

都是实现set的数据结构

  • Treeset的主要功能是排序
  • LinkedHashSet的主要功能是保证FIFO有序的集合(先进先出)
  • HashSet的主要功能是通用的存储数据的集合

相同点

  • 因为三者都实现Set interface,所以三者都不包含duplicate elements
  • 三者都不是线程安全的,如果要使用线程安全可以Collections.synchronizedSet()

不同点

  • HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序
  • HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则
  • HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException

代码比较
List,Map,Set详解_第3张图片List,Map,Set详解_第4张图片

TreeSet的两种排序方式比较

排序的引入

  • 基本数据类型引用
    List,Map,Set详解_第5张图片
    List,Map,Set详解_第6张图片
  • 对象数据类型引用
    List,Map,Set详解_第7张图片List,Map,Set详解_第8张图片List,Map,Set详解_第9张图片
    会报错是因为
    由于不知道该安照那一中排序方式排序,所以会报错。
    解决方法:
    1.自然排序
    2.比较器排序

自然排序
1.Student类中实现 Comparable接口
2.重写Comparable接口中的Compareto方法

compareTo(T o)  比较此对象与指定对象的顺序。

List,Map,Set详解_第10张图片List,Map,Set详解_第11张图片
比较器排序
比较器排序步骤:
1.单独创建一个比较类,这里以MyComparator为例,并且要让其继承Comparator接口
2.重写Comparator接口中的Compare方法
List,Map,Set详解_第12张图片

你可能感兴趣的:(java)