JAVA中List和Map的实现结构介绍

JAVA中List和Map的实现结构介绍

Collection(单列集合)

List(有序,可重复)

ArrayList

  • 底层数据结构是数组,查询快,增删慢
  • 线程不安全,效率高

Vector

  • 底层数据结构是数组,查询快,增删慢
  • 线程安全,效率低

LinkedList

  • 底层数据结构是链表,查询慢,增删快
  • 线程不安全,效率高

Set(无序,唯一)

  • HashSet
    • 底层数据结构是哈希表。
    • 哈希表依赖两个方法:hashCode()和equals()
    • 执行顺序:
      首先判断hashCode()值是否相同
      • 是:继续执行equals(),看其返回值
        • true:说明元素重复,不添加
        • false:就直接添加到集合
      • 否:就直接添加到集合
      • 最终:
        自动生成hashCode()和equals()即可
  • LinkedHashSet
    • 底层数据结构由链表和哈希表组成。
    • 由链表保证元素有序。
    • 由哈希表保证元素唯一。
  • TreeSet
    • 底层数据结构是红黑树。(是一种自平衡的二叉树)
    • 如何保证元素唯一性呢?
      根据比较的返回值是否是0来决定
    • 如何保证元素的排序呢?
      • 两种方式
        1. 自然排序(元素具备比较性)
          让元素所属的类实现Comparable接口
        2. 比较器排序(集合具备比较性)
          让集合接收一个Comparator的实现类对象

Map(双列集合)

  • Map集合的数据结构仅仅针对键有效,与值无关。
  • 存储的是键值对形式的元素,键唯一,值可重复。

HashMap

底层数据结构是哈希表。线程不安全,效率高
哈希表依赖两个方法:hashCode()和equals()

执行顺序:
首先判断hashCode()值是否相同

  • 是:继续执行equals(),看其返回值
    • true:说明元素重复,不添加
    • false:就直接添加到集合
  • 否:就直接添加到集合
  • 最终:
    自动生成hashCode()和equals()即可

LinkedHashMap

底层数据结构由链表和哈希表组成。

  • 由链表保证元素有序。
  • 由哈希表保证元素唯一。

Hashtable

底层数据结构是哈希表。线程安全,效率低
哈希表依赖两个方法:hashCode()和equals()
执行顺序:
首先判断hashCode()值是否相同

  • 是:继续执行equals(),看其返回值
    • true:说明元素重复,不添加
    • false:就直接添加到集合
  • 否:就直接添加到集合
  • 最终:
    自动生成hashCode()和equals()即可

TreeMap

  • 底层数据结构是红黑树。(是一种自平衡的二叉树)
  • 如何保证元素唯一性呢?
    根据比较的返回值是否是0来决定
  • 如何保证元素的排序呢?
    两种方式
    • 自然排序(元素具备比较性)
      让元素所属的类实现Comparable接口
    • 比较器排序(集合具备比较性)
      让集合接收一个Comparator的实现类对象

关于集合选取原则

是否是键值对象形式:

  • 是:Map
    • 键是否需要排序:
      • 是:TreeMap
      • 否:HashMap
    • 不知道,就使用HashMap。
  • 否:Collection
    • 元素是否唯一:
      • 是:Set
        • 元素是否需要排序:
          • 是:TreeSet
          • 否:HashSet
        • 不知道,就使用HashSet
      • 否:List
        • 要安全吗:
          • 是:Vector
          • 否:ArrayList或者LinkedList
            • 增删多:LinkedList
            • 查询多:ArrayList
        • 不知道,就使用ArrayList
    • 不知道,就使用ArrayList

集合的常见方法及遍历方式

Collection:
        add()
        remove()
        contains()
        iterator()
        size()        
        遍历:
            增强for
            迭代器            
        |--List
            get()            
            遍历:
                普通for
        |--Set     
    Map:
        put()
        remove()
        containskey(),containsValue()
        keySet()
        get()
        value()
        entrySet()
        size()        
        遍历:
            根据键找值
            根据键值对对象分别找键和值
posted @ 2023-06-14 11:53  Ysun_top  阅读(48)  评论(0编辑  收藏  举报