17.java中集合的底层实现

2 篇文章 0 订阅
1 篇文章 0 订阅

Collection(List+Set)

|--List 有序,可重复

  |--ArrayList

    底层数据结构是数组,查询快,增删慢。

    线程不安全,效率高

  |--Vector

    底层数据结构是数组,查询快,增删慢。

    线程安全,效率低

  |--LinkedList

    底层数据结构是链表,查询慢,增删快。

   线程不安全,效率高

|--Set 无序,唯一

  |--HashSet

    底层数据结构是哈希表。

   如何保证元素唯一性的呢?

   依赖两个方法:hashCode()equals()

   开发中自动生成这两个方法即可

  |--LinkedHashSet

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

   由链表保证元素有序

   由哈希表保证元素唯一

  |--TreeSet

    底层数据结构是红黑树

   如何保证元素排序的呢?

     自然排序

     比较器排序

     如何保证元素唯一性的呢?

      根据比较的返回值是否是0来决定

Map(双列集合)

A:Map集合的数据结构仅仅针对键有效,与值无关。

B:存储的是键值对形式的元素,键唯一,值可重复。

  |--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

   

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

Collection:

add()添加   remove()   contains()   iterator()获取   size()长度

遍历:

增强for

迭代器

|--List

get()

遍历:

普通for

|--Set

Map:

put()

remove()

containskey(),containsValue()

keySet()

get()

value()

entrySet()

size()

遍历:

根据键找值

根据键值对对象分别找键和值



  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaMap集合是一种用于存储键值对的数据结。它提供了快速的查找和访问元素的能力。在JavaMap接口有多个实现类,如HashMap、TreeMap、LinkedHashMap等,它们在底层实现上有所不同。 其,HashMap是最常用的Map实现类之一。它使用哈希表来存储键值对,通过计算键的哈希码来确定存储位置,从而实现快速的插入、删除和查找操作。具体来说,HashMap内部使用一个数组来存储元素,每个数组元素称为桶(bucket),每个桶可以存储多个键值对。当插入一个键值对时,HashMap会根据键的哈希码计算出对应的桶索引,然后将键值对存储在该桶。当需要查找或删除一个键值对时,HashMap会根据键的哈希码找到对应的桶,并在桶内进行查找或删除操作。 另外,HashMap还使用了链表或红黑树来解决哈希冲突问题。当多个键的哈希码相同时,它们会被存储在同一个桶,形成一个链表或红黑树。这样,在查找或删除时,HashMap会先根据键的哈希码找到对应的桶,然后遍历链表或红黑树来找到具体的键值对。 除了HashMap,还有其他的Map实现类。例如,TreeMap使用红黑树来存储键值对,它能够保持键的有序性;LinkedHashMap在HashMap的基础上使用了双向链表来维护插入顺序或访问顺序。 总结一下,JavaMap集合底层原理主要涉及哈希表、哈希冲突解决和链表/红黑树等数据结构的运用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值