0908集合总结

news2025/1/22 7:54:19

Java集合

Java的集合类主要由Collection接口和Map接口派生而来,其中Collection接口由两个常用的子接口,即List接口和Set接口,所以常说的Java集合框架由三大类接口构成(Map接口、List接口和Set接口)

List接口

  1. List的实现类有Vector、ArrayList、LinkedList、Stack等
    1. Stack类内部是栈结构。是Vector类的子类
  2. Vector是线程安全的
  3. ArrayList是非线程安全的,ArrayList内部使用数组存储元素
  4. LinkedList内部使用双向链表存储元素,
  5. 因此:ArrayList集合随机访问效率高于LinkedList集合,而LinkedList集合在插入元素,删除元素使效率高于ArrayList

Set接口

  1. 实现类:HashSet类和TreeSet类

Map接口

  1. 实现类:HashMap类和Hashtable类等

Collection

Collectio继承了Iterable接口,

Iterable

实现了Iterable接口的类可以通过实现iterator()方法来返回一个迭代器对象,从而使其可以使用for-each循环语法来遍历集合中的元素

在迭代的过程中不能改变结构

Queue接口

  1. 继承自Collection接口的子接口
  2. Queue接口不容许插入null元素,也不容许重复的元素
  3. 实现类:LinkedList、ArrayDeque

Deque接口

  1. 继承自Queue接口
  2. 双向操作
  3. 队列的特点:先进先出
  4. 栈特性
  5. 实现类:ArrayDeque、LinkedList

List接口

List接口继承自Collection接口

  1. 是有序的集合
  2. List接口的实现类:ArrayList、LinkedList、stack、Vector等

ArrayList

  1. 对于ArrayList而言,它实现了List接口,底层使用数组保存所有元素
  2. ArrayList提供了三种方式的构造器

LinkedList

LinkedList类是List接口的链接列表实现类,它支持实现所有List接口可选的列表的操作,并且容许元素值是如何数据,包括null

LinkedList实现了Deque接口,既能将LinkedList当做双端队列使用,

Vector

  1. 实现类List接口
  2. 动态数组:底层是一个数组
  3. 线程安全
  4. 支持随机访问
  5. 可以包含重复元素
  6. 可以插入null元素

stack

  1. stack类是一种后进先出的数据结构,实现类栈的特点‘
  2. 后进先出
  3. 继承自Vector

Set接口

  1. Set接口是Collection接口的另外一个常用子接口
  2. 无顺序
  3. 不重复
  4. 不容许使用索引
  5. 非同步

HashSet

  1. 元素唯一
  2. 无序性
  3. 基于哈希表
  4. 非同步
  5. 容许null

TreeSet

  1. 实现了Set接口的有序集合,它使用红黑树
  2. 元素安装自然排序或者指定的构造器
  3. 元素唯一性
  4. null元素的处理:不容许null
  5. 插入、删除、查找:基于红黑树
  6. 迭代器顺序

Map接口

  1. 键值对应:
  2. 无序性
  3. 容许空键值
  4. 非同步

HashMap

  1. 容许nul键和null值

构造方法

  1. HashMap()无参构造函数:默认容量初始化时16,默认的加载因子是0.75
  2. HashMap(intinitialCapacity)可以对容量进行设置,健壮因子默认值是0.75,调用的是下面的有参构造函数
  3. HashMap(int initialCapacity,float loadFactor)可以指定容量和加载因子,容量不可以小于0,也不可以无限大,加载因子也不能为0,也不能比0小
  4. HashMap(Map map)创建一个新的HashMap,加载因子是默认值0.75.然后通过putMapEnries()将map的值存储到新的HashMap中
  5. HashMap底层原理:底层是数组,称为哈系桶【jdk7是数组+链表、、、jdk8是数组+链表+红黑树】

Hashtable

  1. 线程安全
  2. 键值不容许为null
  3. 解决哈希冲突
  4. 动态扩容

Queue接口

  1. 继承Collection接口
  2. Queue接口不容许null

ArrayDeque是Queue的实现类

  1. 继承自AbstractCollection
  2. 实现Queue接口
  3. 底层是数组存储

LinkedList也是Queue的实现类

  1. 继承AbstractSequentialList抽象类
  2. 实现List、Deque、Cloneable接口
  3. 底层是一个链表

Deque是非线程安全的

List接口

  1. 可以存储一组不唯一、无序的对象
  2. List接口继承自Collection接口
  3. 是有序集合
  4. 可以通过索引访问List接口中的元素
  5. 实现类:ArrayList、LinkedList、Stack、Vector

ArrayList是List的实现类

  1. ArrayList继承自AbstractList抽象类

  2. ArrayList实现了List、Cloneable接口

  3. 底层的存储使用的是数组

  4. 添加元素是先判断数组是否越界,如果越界使用grow()进行扩容

  5. 有三种构造方法

  6. 非线程安全

  7. 删除元素后,因为底层是数组,所以长度会变化

    1. List list = new ArrayList();
            list.add("a");
            list.add("b");
            list.add("c");
            list.remove(0);
            System.out.println(list.get(0));//b
            System.out.println(list.size());//2
      

LinkedList是List的实现类

  1. 继承自AbstractSequentialList抽象类
  2. 实现了List、Deque、Cloneable接口
  3. 容许元素值是如何,可以是null
  4. 可以当做双端队列使用
  5. 底层是通过双向链表实现的
  6. 非线程安全

Stack是List的实现类,但是他不直接实现List,而是通过继承Vector实现List接口

  1. 后进先出
  2. 继承自Vector
  3. 线程安全
  4. 底层是数组
  5. 可以包含null
  6. 支持随机访问

Vector也是List的实现类

  1. 继承自AbstractList抽象类
  2. 实现了List、Cloneable接口
  3. 默认构造的容量为10
  4. 线程安全
  5. 可以包含重复元素
  6. 可以插入null元素

Set接口

  1. set接口是Collection接口的另一个常用子接口
  2. 存储唯一
  3. 无序对象
  4. 不容许重复元素
  5. 不容许使用索引
  6. 非同步(非线程安全)

HashSet是Set的实现类

  1. 继承自AbstractSet抽象类
  2. 实现了Set、Cloneable接口
  3. 基于哈希表实现
  4. 非同步
  5. 容许null
  6. 元素唯一
  7. 无序性
  8. 默认加载因子0.75

TreeSet实现Set

  1. 基于红黑树实现的,具有排序功能
  2. TreeSet可以按照元素的自然排序进行排序,也可以提供比较器来指定排序规则
  3. 元素唯一性
  4. null元素的处理,不容许null

LinkedHashSet实现Set接口

  1. 元素唯一
  2. 保证元素插入顺序
  3. 基于哈希表和链表实现的
  4. 容许null
  5. 迭代器顺序,按照插入顺序进行遍历
  6. image-20230908205840116

Map接口

  1. 键唯一、值可重复
  2. 无序性
  3. 容许空键值
  4. 非同步

HashMap实现Map接口

  1. 继承自AbstractMap抽象类
  2. 实现Map、Clonable接口
  3. 默认初始容量必须是2的次幂(16)
  4. 、构造函数中未指定时使用的负载系数为0.75
  5. 链表的长度超过8,转为树
  6. 如果树的长度超过64,则对数组进行扩容
  7. 负载因子:判断是否需要扩容,默认值为0.75
  8. 阈值:当HashMap的大小超过一定阈值时,会触发扩容操作
  9. HashMap底层是数组
  10. Jdk7==数组+链表
  11. Jdk8===数组+链表+红黑树

put的过程

  1. 根据key计算hash值,在put的时候判断数组是否存在,如果不存在则用resize方法创建默认长度为16的数组
  2. 确定要存入的Node在数组中的位置,根据hash值与数组最大索引进行按位与运行得到索引的位置
  3. 判断该位置是否有元素,如果没有直接创建一个Node存入,如果有元素,判断key是否相同,如果相同则覆盖,并且将原来的值直接返回,如果key不相同,在原Node的基础上添加新的Node,判断该位置是否是红黑树
  4. 如果是红黑树,将Node存入红黑树
  5. 如果是链表,遍历链表,找到最后一位,将Node存入
  6. 将Node存入链表之后,判断链表的结构是否要调整,判断链表长度是否超过8,如果超过8需要将链表转为红黑树,这里还有一个条件,如果数组容量小于64,不转换红黑树,而是进行数组扩容,当数组的容量大于64的时候,再将链表转为红黑树
  7. 存完之后,在判断数组是否进行扩容,根据负载因子来判断

入,如果有元素,判断key是否相同,如果相同则覆盖,并且将原来的值直接返回,如果key不相同,在原Node的基础上添加新的Node,判断该位置是否是红黑树
4. 如果是红黑树,将Node存入红黑树
5. 如果是链表,遍历链表,找到最后一位,将Node存入
6. 将Node存入链表之后,判断链表的结构是否要调整,判断链表长度是否超过8,如果超过8需要将链表转为红黑树,这里还有一个条件,如果数组容量小于64,不转换红黑树,而是进行数组扩容,当数组的容量大于64的时候,再将链表转为红黑树
7. 存完之后,在判断数组是否进行扩容,根据负载因子来判断

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/991052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无锡哲讯与喜德金属联手推动“百城千园行”“十园千企”无锡站活动,数字化赋能活动动

当前,新一轮科技革命和产业革命席卷全球,数字经济发展速度之快、辐射之广、影响之深前所未有。2023年9月7日,为加快推进制造业智能化改造、数字化转型,促进供需两端精准对接,加速提升汽车及零部件产业集群企业智能制造…

【多线程】内存可见性

一、什么是内存可见性 内存可见性是在编译器优化的背景下,一个线程修改了变量而另一个线程却没有感知到修改。举个例子,一个线程一直频繁的读取变量n并将n值与某一值进行比较,在底层这个操作对应着两个指令:读取内存中的n值加载到…

【Redis】深入探索 Redis 的数据类型 —— 字符串 string

文章目录 前言一、string 类型的操作命令设置和获取相关命令1. SET 和 GET2. MSET 和 MGET3. SETNX、SETEX、SETPX 计数相关命令1. INCR 和 INCRBY2. DECR 和 DECRBY3. INCRBYFLOAT 字符串操作相关命令1. APPEND2. GETRANGE3. SETRANGE4. STRLEN string 相关命令总结 二、strin…

解决VSCode调试或者发布运行时闪退问题

解决方案:此方案不一定适合所有类型的闪退,但可以尝试一下。 步骤1:依次选择:文件→首选项→设置 步骤2:搜索 terminal.integrated.Default →找到Terminal > Integrated Default Profile: Windows选项→下拉框的…

Git 客户端基本使用及新手常见问题

Git作为一个版本管理工具,在企业中的应用越来越普遍。作为一个测试工程师,不可避免会需要接触到Git的相关操作,以下整理Git客户端的常见操作,以及应用中新手常碰到的一些问题。 1、环境安装及配置 Git下载地址:https…

YOLOV7改进-添加基于注意力机制的目标检测头(DYHEAD)

DYHEAD 复制到这: 1、models下新建文件 2、yolo.py中import一下 3、改IDetect这里 4、论文中说6的效果最好,但参数量不少,做一下工作量 5、在进入IDetect之前,会对RepConv做卷积 5、因为DYHEAD需要三个层输入的特征层一致&am…

【DS思想+堆贪心】CF595div3 D2

Problem - D2 - Codeforces 题意: 思路: 大家都说这是典,但是我不懂怎么个典法,可能堆贪心都是这样做的吗,不懂 首先肯定要贪心,对于一个坏点,优先删除覆盖别的点多的 考虑nlogn做法&#x…

9.177777777

Tomcat配置ssl 部署tomcat服务,项目做到用https访问,使用nginx去做,访问任意一个子网站,都是https 或者 医美项目需要 上传jdk 456 tomcat war包 [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/…

关于Greenplum Platform Extension Framework(PXF)

本文翻译自 https://docs.vmware.com/en/VMware-Greenplum-Platform-Extension-Framework/6.6/greenplum-platform-extension-framework/overview_pxf.html 随着数据存储和云服务的爆炸式增长,数据现在以各种格式驻留在许多不同的系统中。通常,数据根据…

Maven学习记录

一、Maven是什么 简单来说Maven是一个标准化的java管理和构建工具,它提供了一系列规范,包括项目结构,构建流程(编译,测试,打包,发布……),依赖管理等。 标准化就是定下…

科技项目验收怎么做?不通过怎么办?

CMA、CNAS 一、科技项目验收是什么? 科技项目验收测试是依据GB/T 17544《信息技术 软件包 质量要求和测试》、GB/T 16260《软件工程 产品质量》,对申报国家、省、市科技项目、或企业申请中小企业创新基金、科技项目验收、科技成果鉴定等提供软件产品第…

机器学习——自然语言处理(NLP)一

机器学习——自然语言处理(NLP)一 文章目录 前言一、TF-IDF算法1.1. 原理1.2. 算法步骤:1.2.1. 文本预处理1.2.2. 构建词袋模型1.2.3. 计算TF-IDF值1.2.4. 特征选择 1.3. 代码实现1.3.1. TF-IDF1.3.2 计数器向量化文本1.3.3. 两者的区别1.3.4…

Android MeidiaCodec之OMXPluginBase与QComOMXPlugin实现本质(四十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

帧动画实现

背景: pag实现痛点 文档:libpag参考文档 1.打包依赖的类型缺失问题 2.pagview初始化文件过大,影响小程序打包 3.兼容性较差关键帧动画实现痛点: 当关键帧变化过多的时候,无法准确分辨出需要写出多少个关键帧,以及各个关键帧的具…

umi 中的路由切换动画如何实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 umi路由切换动画步骤 1、查看node版本2、搭建脚手架①.找个地方建一个空目录2.搭建umi脚手架3.正式配置路由动画1.1 在src文件目录下创建一个 layouts文件夹,在文…

【疑难杂症】用户无法使用sudo提权

目录 用户无法使用sudo提权 用户无法使用sudo提权 第一步:切换成超级用户。 su 第二步:打开/etc/sudoers文件。 vim /etc/sudoers 第三步:将用户添加到文件力。 这样就得到解决了......

404 not found nginx(dist打包后,刷新和跳转都是404 not found nginx的问题) 解决方案(打包发布在服务器)

当我们执行了yarn run build之后,生成dist文件 我们将代码放入nginx-1.24.0下面的html中 然后我们就配置conf文件下的nginx.conf 配置方面不介绍了,主要问题是因为没有加这句话 问题分析 index index.htm index.html; index 就是根目录,也就…

Android获取 H264视频流中的SPS和PPS

代码其实很简单,主要是要知道H264帧数据结构。分析H264码流结构的文章一大把,自己网上搜索一下就知道了。 背景: h264aac封装mp4格式的时候,需要获取视频流的sps,pps。 封装mp4文件格式的大体方案 使用 MediaExtractor 和 Medi…

Python实现机器学习(上)— 基础知识介绍及环境部署

前言:Hello大家好,我是小哥谈。本门课程将介绍人工智能相关概念,重点讲解机器学习原理机器基本算法(监督学习及非监督学习)。使用python,结合sklearn、jupyter-notebook进行编程,介绍iris、匹马…

【Mysql系列】(二)日志系统:一条更新语句是如何执行的

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 这篇文章是从Github ReadMe拷贝的,内容实践下载是没问题的,能够正常发送短信,而且也不需要服务器,本地…