首页 > 其他分享 > 【博学谷学习记录】超强总结,用心分享 集合重要知识点。

【博学谷学习记录】超强总结,用心分享 集合重要知识点。

时间:2022-11-20 18:57:45浏览次数:38  
标签:知识点 存储 HashMap 博学 链表 线程 数组 超强 数据结构

集合

  1.1 常见的数据结构

    常见的 数据结构有:数组、栈、队列、链表、树、散列、堆、图等。

    数组是最常用的数据结构,数组的特点是长度固定,数组的大小固定后就无法扩容了 ,数组只能存储一种类型的数据 ,添加,删除的操作慢,因为要移动其他的元素。

 

     栈是一种基于先进后出(FILO)的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。

 

     队列是一种基于先进先出(FIFO)的数据结构,是一种只能在一端进行插入,在另一端进行删除操作的特殊线性表,它按照先进先出的原则存储数据,先进入的数据,在读取数据时先被读取出来。

 

        链表是一种物理存储单元上非连续、非顺序的存储结构,其物理结构不能只表示数据元素的逻辑顺序,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列的结节(链表中的每一个元素称为结点)组成,结点可以在运行时动态生成。根据指针的指向,链表能形成不同的结构,例如单链表,双向链表,循环链表等。

 

     树是我们计算机中非常重要的一种数据结构,同时使用树这种数据结构,可以描述现实生活中的很多事物,例如家谱、单位的组织架构等等。有二叉树、平衡树、红黑树、B树、B+树。

 

       散列表,也叫哈希表,是根据关键码和值 (key 和 value) 直接进行访问的数据结构,通过 key 和 value 来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。

 

       堆是计算机学科中一类特殊的数据结构的统称,堆通常可以被看作是一棵完全二叉树的数组对象。

 

     图的定义:图是由一组顶点和一组能够将两个顶点相连的边组成的

 

 

   1.2集合和数组的区别

    区别:数组长度固定、集合长度可变

       数组中存储的是同一种数据类型的元素,可以存储基本数据类型,也可以存储引用数据类型

         集合存储的都是对象,而且对象的数据类型可以不一致,在开发中一档当对象较多的时候,使用集合来存储对象。

 

   1.3 List 和 Map、Set 的区别

      区别:

        List和set是存储单列数据的集合,map是存储键值对这样的双列数据的集合。

        List中存储的数据是有顺序的,并且值允许重复;

        map中存储顺序是无序的,它的键是不允许重复的,但是值允许重复

        set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是有元素的hashcode决定,即位置是固定的(Set 集合是根据 hashcode 来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说 set 中的元素还是无序的)

 

    1.4 List 和 Map、Set 的实现类

      Collection接口:

        List 有序, 可重复

            ArrayList

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

              缺点: 线程不安全,效率高

            

            Vector

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

                  缺点: 线程安全,效率低, 已给舍弃了

                LinkedList

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

                  缺点: 线程不安全,效率高

          Set 无序,唯一

            HashSet

               底层数据结构是哈希表。(无序,唯一)如何来保证元素唯一性?

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

                LinkedHashSet

                  底层数据结构是链表和哈希表。(FIFO 插入有序,唯一)

                    1.由链表保证元素有序

                    2.由哈希表保证元素唯一

                TreeSet

                  底层数据结构是红黑树。(唯一,有序)

                  如何保证元素排序的呢?

                    自然排序

                    比较器排序

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

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

           Map 接口有四个实现类:

           HashMap

          基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null 键, 线程不安全。

          HashTable

          线程安全,低效,不支持 null 值和 null 键;

          LinkedHashMap

          线程不安全,是 HashMap 的一个子类,保存了记录的插入顺序;

          TreeMap

          能够把它保存的记录根据键排序,默认是键值的升序排序,线程不安全。

     1.5Hashmap 的底层原理

          HashMap 在 JDK1.8 之前的实现方式 数组+链表,

 

 

 

          但是在JDK1.8 后对HashMap 进行了底层优化,改为了由 数组+链表或者数值+红黑树实现,主要的目的是提高查找效率

 

 

 

 

 


Jdk8 数组+链表或者数组+红黑树实现,当链表中的元素超过了 8 个以后, 会将链表转换为红黑树,当红黑树节点 小于 等于 6 时又会退化为链表

  1. 当 new HashMap():底层没有创建数组,首次调用 put()方法示时,底层创建长度为 16 的数组,jdk8 底层的数组是:Node[],而非 Entry[],用数组容量大小乘以加载因子得到一个值,一旦数组中存储的元素个数超过该值就会调用 rehash 方法将数组容量增加到原来的两倍,专业术语叫做扩容,在做扩容的时候会生成一个新的数组,原来的所有数据需要重新计算哈希码值重新分配到新的数组,所以扩容的操作非常消耗性能.

默认的负载因子大小为 0.75,数组大小为 16。也就是说,默认情况下,那么当 HashMap中元素个数超过 16*0.75=12 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍。

  1. 在我们 Java 中任何对象都有 hashcode,hash 算法就是通过 hashcode 与自己进行向右位移 16 的异或运算。这样做是为了计算出来的 hash 值足够随机,足够分散,还有产生的数组下标足够随机,

map.put(k,v)实现原理

(1)  首先将 k,v 封装到 Node 对象当中(节点)。

(2)  先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。

(3)  下标位置上如果没有任何元素,就把 Node 添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着 k 和链表上每个节点的 k 进行 equal。如果所有的 equals 方法返回都是 false,那么这个新的节点将被添加到链表的末尾。如其中有一个 equals 返回了 true,那么这个节点的 value 将会被覆盖。

map.get(k)实现原理

(1)  、先调用 k 的 hashCode()方法得出哈希值,并通过哈希算法转换成数组的下标。

(2)  、在通过数组下标快速定位到某个位置上。重点理解如果这个位置上什么都没有,则返


回 null。如果这个位置上有单向链表,那么它就会拿着参数 K 和单向链表上的每一个节点的 K 进行 equals,如果所有 equals 方法都返回 false,则 get 方法返回 null。如果其中一个节点的K 和参数K 进行equals 返回true,那么此时该节点的value 就是我们要找的value了,get 方法最终返回这个要找的 value。

  1. Hash 冲突

不同的对象算出来的数组下标是相同的这样就会产生 hash 冲突,当单线链表达到一定长度后效率会非常低。

在链表长度大于 8 的时候,将链表就会变成红黑树,提高查询的效率

 

 

1.6   Hashmap 和 hashtable ConcurrentHashMap 区别

 区别对比一(HashMap 和 HashTable 区别):

1、HashMap 是非线程安全的,HashTable 是线程安全的。

2、HashMap 的键和值都允许有 null 值存在,而 HashTable 则不行。 3、因为线程安全的问题,HashMap 效率比 HashTable 的要高。

4、Hashtable 是同步的,而 HashMap 不是。因此,HashMap 更适合于单线程环境,而 Hashtable 适合于多线程环境。一般现在不建议用 HashTable, ① 是 HashTable 是遗留类,内部实现很多没优化和冗余。②即使在多线程环境下,现在也有同步的 ConcurrentHashMap 替代,没有必要因为是多线程而用 HashTable。

 

 

区别对比二(HashTable 和 ConcurrentHashMap 区别):

HashTable 使用的是 Synchronized 关键字修饰,ConcurrentHashMap 是 JDK1.7 使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap 取消了 Segment 分段锁,采用 CAS 和 synchronized 来保证并发安全。数据结构跟 HashMap1.8的结构类似,数组+链表/红黑二叉树。

synchronized 只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,效率又提升 N 倍。

 

标签:知识点,存储,HashMap,博学,链表,线程,数组,超强,数据结构
From: https://www.cnblogs.com/linwenguan/p/16909191.html

相关文章

  • 【博学谷学习记录】超强总结,用心分享|moco
    一、介绍1、什么是mock1)mock就是对于一些难以构造的对象,使用虚拟的技术来实现测试的过程。2)mock测试:在测试过程中,对于某些不容易构造或者不容易获取的对象,可以用一个虚......
  • JAVA学习方法与知识点
       这个时代有很多的朋友都开始选择看看学习学习当下热门的编程语言比如现在的Java这类技术。俗话说的好啊天下熙熙皆为利来,天下攘攘皆为利往,目前大多都是为了高薪工......
  • MySQL知识点(一)
    MySQL知识点(一)目录MySQL知识点(一)一、B树和B+树之间的区别是什么?1、B树2、B+树二、Innodb中的B+树是怎么产生的?三、高度为3的B+树能存多少条数据?四、Innodb引擎是如......
  • 小知识点-第四讲
    装饰模式:它拥有一个设计非常巧妙的结构,他可以动态添加对象功能,通过委托机制复用组件功能在运行时将这些功能组件进行叠加,从而成为一个“超级对象”,使之拥有所有的这些组件......
  • 小知识点-第三讲
    享元模式:利用享元模式进行对象共享,从而提升系统性能(空间开销和创建创建开销)。在开发的过程中也经常使用此模式。 原理: 当一个应用中使用了大量的对象,这些对象造成了很大的......
  • 划重点计算机网络知识点总结
    第一章概述基本概念链路,结点,协议和服务,实体和对等实体,各层PDU链路:连接结点的称为链路,可以是铜缆,光纤,卫星等结点:可以是计算机,集线器,交换机或路由器等协议:两个......
  • 【博学谷学习记录】超强总结,用心分享 | 单例设计模式总结
    单例设计模式单例模式(SingletonPattern)涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不......
  • Vue2基础知识点
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"conten......
  • vue组件通信6种方式总结(常问知识点)
    前言在Vue组件库开发过程中,Vue组件之间的通信一直是一个重要的话题,虽然官方推出的Vuex状态管理方案可以很好的解决组件之间的通信问题,但是在组件库内部使用Vuex往往会......
  • React-hooks面试考察知识点汇总
    Hook简介Hook出世之前React存在的问题在组件之间复用状态逻辑很难React没有提供将可复用性行为“附加”到组件的途径(例如,把组件连接到store)。有一些解决此类问题的......