首页 > 其他分享 >集合理解

集合理解

时间:2023-12-09 11:56:56浏览次数:25  
标签:HashMap 元素 哈希 链表 理解 线程 数组 集合

  1.集合类分三个顶级接口:Set,List,Map,其中Set List 继承至Collection接口,Map为独立接口。

    

  2.分类

    Set下有HashSet,LinkedHashSet,TreeSet
    List下有ArrayList,Vector,LinkedList
    Map下有AbstractMap AbstractMap下 Hashtable,LinkedHashMap,HashMap,TreeMap

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

 

  3.常见的集合

    HashSet

    底层数据结构是哈希表。(无序,唯一)
    如何来保证元素唯一性?
    1.依赖两个方法:HashSet的构造方法其实就是在内部实例化了一个HashMap对象,通过hashCode()和equals()
    如果hash码值相同,且equles判断相等,说明元素已经存在,不存;
    如果hash码值相同,且equles判断不相等,说明元素不存在,存;

    LinkedHashSet
    底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
    1.由链表保证元素有序
    2.由哈希表保证元素唯一

    TreeSet
    底层数据结构是红黑树。(唯一,有序)
    1. 如何保证元素排序的呢?
    自然排序
    比较器排序
    2.如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

 

    hashMap

    HashMap的默认大小是16

              结构:1.7 数组+链表   1.8 数组+链表+红黑树

              转红黑树的条件:HashMap转红黑树的条件是链表长度大于8且桶的数量大于64

               hashMap红黑树的复杂度:红黑树是一种平衡的二叉搜索树,其最坏情况下的时间复杂度为O(log n)。在最坏情况下,所有的元素都会被放置在同一个桶中,形成一个长链表,即HashMap中所有元素的哈希值都相同时,时间复杂度会退化为O(n),

    底层原理:当添加元素到HashMap时,会先通过哈希函数计算出该元素在数组中的位置,然后判断该位置是否已存在其他元素。如果存在,新元素就会以链表的形式添加到这个位置;如果不存在,则直接存储在该位置。1.8后,当一个位置的链表长度超过8时,元素个数超过64,转为红黑树。提高查询效率。

    扩容机制:HashMap中的元素数量达到当前容量的一半时,会触发扩容操作。扩容操作会将HashMap的容量扩大为原来的两倍,并将所有元素重新计算哈希值并放置到新的数组中。这个操作相对比较耗时,因此,在创建HashMap时,可以根据预期的元素数量指定一个合适的初始容量,以减少扩容的次数和避免出现过于接近容量上限的情况,从而提高HashMap的性能。

 

    linkList:

    其底层结构是由一个双向链表维护的,包含头指针和尾指针。每个节点包含用于存数据的item、指向前一节点的指针prev和指向后一节点的指针next

 

    线程安全的list:

    1. Vector:Vector是大家熟知的线程安全的List集合,不过它的性能不是最优的,所有的方法都是加了synchronized来同步,从而保证线程安全。
    2. Collections.SynchronizedList:SynchronizedList是Collections类的静态内部类,它能把所有List接口的实现类转换成线程安全的List,比Vector有更好的扩展性和兼容性。

 

    为什么数组比链表查询速度更快?
  数组由于是紧凑连续存储,可以随机访问,通过索引快速找到对应元素,而且相对节约存储空间。但正因为连续存储,内存空间必须一次性分配够,所以说数组如果要扩容,需要重新分配一块 更大的空间,再把数据全部复             制过去,时间复杂度 O(N);而且你如果想在数组中间进行插入和删除,每次必须搬移后面的所有数据以保持连续,时间复杂度 O(N)。
       链表因为元素不连续,而是靠指针指向下一个元素的位置,所以不存在数组的扩容问题;如果知道某一元素的前驱和后驱,操作指针即可删除该元素或者插入新元素,时间复杂度O(1)。但是 正因为存储空间不连续,你无           法根据一个索引算出对应元素的地址,所以不能随机访问;而且由于每个元素必须存储指向前后元素位置的指针,会消耗相对更多的储存空间。

 

  java中数组怎么扩容的?

        ArrayList,默认大小为10

  1. 创建一个新的数组,其长度通常是原有数组长度的两倍(也可以根据需要设定其他倍数)。
  2. 将原有数组中的元素复制到新数组中。
  3. 让 ArrayList 引用指向新数组。

 

  

     

  

 

  

 

标签:HashMap,元素,哈希,链表,理解,线程,数组,集合
From: https://www.cnblogs.com/zuoyi2319516228/p/17889447.html

相关文章

  • 【EMNLP 2023】基于知识迁移的跨语言机器阅读理解算法
    近日,阿里云人工智能平台PAI与华南理工大学朱金辉教授团队、达摩院自然语言处理团队合作在自然语言处理顶级会议EMNLP2023上发表基于机器翻译增加的跨语言机器阅读理解算法X-STA。通过利用一个注意力机制的教师来将源语言的答案转移到目标语言的答案输出空间,从而进行深度级别的辅助......
  • 从根上理解elasticsearch(lucene)查询原理(1)-lucece查询逻辑介绍
    大家好,我是蓝胖子,最近在做一些elasticsearch慢查询优化的事情,通常用分析elasticsearch慢查询的时候可以通过profileapi去分析,分析结果显示的底层lucene在搜索过程中使用到的函数调用。所以要想彻底弄懂elasticsearch慢查询的原因,还必须将lucene的查询原理搞懂,今天我们就先来介......
  • 软件测试/人工智能|一文告诉你Python集合相关知识
    前言集合(set)是Python中一种重要的数据结构,它提供了存储唯一元素的容器,集合能够让我们高效地执行诸如成员检测、交集、并集等操作。让我们一起深入了解Python中的集合吧!什么是集合?集合是Python中的一种数据结构,类似于数学中的集合概念。它是一组无序且唯一的元素的集合,不允......
  • 静态HTTP和动态HTTP的区别:理解二者的优势和局限
    在互联网的世界里,HTTP(HypertextTransferProtocol)是当之无愧的“交通规则”。它负责在浏览器和服务器之间传输数据,让你可以在网页上浏览、互动和下载内容。根据动态和静态的不同,HTTP网站可以分为静态HTTP网站和动态HTTP网站。这两种类型网站都有其特定的优势和局限。静态HTTP网站:......
  • 深入理解Dockerfile:构建容器化应用的基石
    Docker已经成为现代软件开发和部署的标配工具之一,它的轻量级容器技术使得应用可以在不同环境中快速部署和运行。Dockerfile是构建Docker镜像的蓝图,定义了从基础镜像到最终应用镜像的一系列步骤。本篇博文将深入解析Dockerfile中常见的指令,带你逐步了解如何构建高效、可维护的Docker......
  • 2.集合(Map)
    在我们的代码开发中,Map键值对集合是我们经常使用的数据存储结构,他用着O(1)的查询时间复杂度,为我们的查询操作提供了优质的效率。1.Map1.1HashMap与HashTable的区别线程是否安全:HashMap是非线程安全的,Hashtable是线程安全的,因为Hashtable内部的方法基本都经过synchro......
  • CentOS7 常用命令集合
    常用命令文件与目录操作以下是CentOS7防火墙的完整操作命令:查看防火墙状态。systemctlstatusfirewalld开启/关闭防火墙。systemctlstart/stopfirewalld查看已安装防火墙规则。firewall-cmd--list-ports添加端口到防火墙上。firewall-cmd--add-port=80/tcp--perman......
  • 面向对象建模图的理解
    1,用例图用例图用于描述系统提供的系列功能,而每个用例则代表系统的一个功能模块。用例图的主要目的是帮助开发团队以一种可视化的方式理解系统的需求功能,用例图对系统的实现不做任何说明,仅仅是系统功能的描述。用例图包括:用例、角色、角色和用例之间的关系,以及系统内用例之间的关......
  • UML建模:深入理解软件设计的语言
    统一建模语言(UnifiedModelingLanguage,简称UML)是一种用于软件开发和系统设计的标准建模语言。它提供了一套图形化的工具,帮助软件开发者更好地理解、设计和交流复杂系统。在本文中,我们将深入探讨UML建模的重要性、主要图表类型以及如何有效应用UML来提高软件开发过程的质量。UML......
  • classnames的理解
    本篇文章主要是学习classnames的相关理解及使用。下面列举的是如何在项目中使用安装方式npminstallclassnames使用方式引入时可使用require的方式引入,也可以通过import的方式引入使用方法importclassnamesform'classnamesclassnames('foo','bar')=='foobar'cla......