一、深入理解-Java集合初篇

2023-11-01

导读:

本篇文章开始我们将要开始讲解Java集合,包括List、Set、Map等,也会对HashMap做深入的讲解。通过JDK1.7和JDK1.8两个版本的源码分析一步一步引导大家理解编程思想。同时还会就JDK1.7、JDK1.8两个版本的哈希冲突解决机制、哈希扩容机制等内容做深入的讲解。本篇将先引导大家认识Java集合并就各集合之间的优缺点简单分析。

Java集合类图

在这里插入图片描述

Java集合框架之List

在这里插入图片描述

Arraylist

底层数组实现,有序,可重复,不可为空

查找快,增删慢,

非线程安全

扩容原来的1.5倍

数组中数据必须是连续的存储空间,

因此在增加或者删除时候都需要移动数组后面的内容,时间复杂度为0(n)

Vector

底层数组实现,有序,可重复,不可为空

查找快,增删慢,

线程安全—效率低

扩容原来的一倍

由于要实现线程安全因为效率较低

LinkedList

双向循环链表实现,有序,可重复

增删快,查找慢

非线程安全

无需扩容

提供了专门用于操作表头和表尾的元素,可以模拟栈、队列、双向队列使用

ArrayList与LinkedList的实现和区别

ArrayList底层是数组实现,查找快,增删慢。在随机访问或者指定indx的情况下查询速度的时间复杂度是O1;增删慢是因为,每次增加和删除数据都需要移动剩余的数据,另外在数组在初始的时候就需要指定容量,不然后期会动态扩容。

LinkedList的底层是双向链表实现,查找慢,增删快。由于需要从头或者尾部一个一个向下查找,所以时间复杂度为0n。他增删快是因为只需要改变节点中的指针即可。而且不需要动态扩容,因为是一个一个向后或者向前指向的指针;

ArrayList适合随机查找多,增删少的环境;

LinkedList适合增删多的环境;

双向链表可以模拟栈和队列。

头存头取-栈;

头存尾取-队列;

ArrayList扩容-初始默认10,如果个数大于其容量,则扩展为原来的1.5倍。

Java集合框架之Set

在这里插入图片描述

值不可以重复。

存储无序(存入和取出的顺序不一定相同)

对象的相等性本质是对象hashCode值(java是依据对象的内存地址计算出的序号)判断的,如果想要让两个不同的对象视为相等的,就必须覆盖Object的hashCode方法和equals方法

HashSet

底层使用hash表-hash桶,一个hashCode下可以存放多个元素。

内部hashMap实现,

无序,

不可重复

存取速度快

TreeSet

  1. 二叉树实现按照-指定的序列进行排序(升序、降序),每次插入一个对象都会进行一次排序,然后插入二叉树中指定的位置。

  2. Integer和String默认都使用TreeSet排序,如果要自定义排序,则必须要实现Comparable接口,然后重写compareTo()方法。

  3. 重写compareTo()方法时候,内部要返回一定的值才可以按照这个值进行排序。

内部使用TreeMap的SortedMap

排序存储

LinkedHashSet

HashSet+LinkedHashMap

双向链表记录插入顺序,

继承HashSet,又基于LinkedHashMap实现。

Java集合框架之 Map

在这里插入图片描述

HashMap

JDK1.7—》哈希表,链表

JDK1.8—》哈希表,链表,红黑树— JDK1.8之后,当链表长度超过8使用红黑树。

非线程安全

0.75的负载因子,扩容必须为原来的两倍。

默认大小为16,传入的初始大小必须为2的幂次方的值,如果不为也会变为2的幂次方的值。

Key不可重复,值可重复

Key可以为空,value也可以为空,但不可同时为空。

根据HashCode存储数据。

hashTable

哈希表

线程安全

Key不可重复,value可重复

Key和value都不可以为空

treeMap

二叉树(红黑树),可以实现一致性哈希的哈希环。

TreeMap 数据结构 key 实现Compare解耦,

TreeMap怎么实现有序的?

TreeMap是按照Key的自然顺序或者Comprator的顺序进行排序,内部是通过红黑树来实现。所以要么key所属的类实现Comparable接口,或者自定义一个实现了Comparator接口的比较器,传给TreeMap用户key的比较。

如果想继续深入学习Java集合相关内容,请关注本头条号。
如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒

Java集合还需要学习的内容

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一、深入理解-Java集合初篇 的相关文章

随机推荐

  • window.open()的所有参数列表(转)

    前言 经常上网的朋友可能会到过这样一些网站 一进入首页立刻会弹出一个窗口 或者按一个连接或按钮弹出 通常在这个窗口里会显示一些注意事项 版权信息 警告 欢迎光顾之类的话或者作者想要特别提示的信息 其实制作这样的页面效果非常的容易 只要往该页
  • Python-玩转数据-Scrapy框架介绍及安装

    一 Scrapy框架说明 1 Scrapy介绍 Scrapy框架官方网址 http doc scrapy org en latest Scrapy是用纯Python实现一个为了爬取网站数据 提取结构性数据而编写的应用框架 用途非常广泛 用户
  • 如果访问云服务器上的文件,如果访问云服务器上的文件

    如果访问云服务器上的文件 内容精选 换一换 WinSCP工具可以实现在本地与远程计算机之间安全地复制文件 与使用FTP上传代码相比 通过 WinSCP 可以直接使用服务器账户密码访问服务器 无需在服务器端做任何配置 通常本地Windows计
  • [Qt]不带标题栏(FramelessWindowHint)的窗体移动及调整大小

    Qt窗体若设置了 setWindowFlags Qt FramelessWindowHint 运行后该窗体是无法进行移动和调整大小的 那要如何才能让它和普通窗体一样进行移动和调整其大小的呢 方案如下 void QFramelessWindo
  • 【八组输入输出你都了解多少】

    目录 前言 一 总览 一 只能从标准流 std 中输入和输出数据 二 可以从所以流中读取和写入数据 三 只能从字符串中读取和写入数据 二 详细描述 一 scanf fscanf sscanf 1 scanf 2 fscanf 3 sscan
  • 震惊,docker操作竟如此简单

    Docker概述 1 什么是Docker Docker 是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中 然后发布到任何流行的Linux和Windows操作系统的机器上 也可以实现虚拟化 容器是完全使用沙箱
  • c#—OpenFileDialog(打开文件对话框)

    OpenFileDialog是什么 OpenFileDialog是一个类 实例化此类可以设置弹出一个文件对话框 比如 我们发邮件时需要上传附件的时候 就会弹出一个让我们选择文件的对话框 我们可以根据自己的需求 自行设置一些对话框的属性 那么
  • ASP.NET WebAPI 连接数据库

    ASP NET Web API 是一种框架 用于轻松构建可以访问多种客户端 包括浏览器和移动设备 的 HTTP 服务 ASP NET Web API 是一种用于在 NET Framework 上构建 RESTful 应用程序的理想平台 本文
  • window11中Jdk1.8下载,安装和环境配置(超详细)

    一 下载安装包 这里为了方便大家 提供百度网盘下载 链接 https pan baidu com s 1 Qz7pO226To7yy6ytdPR Q https pan baidu com s 1 Qz7pO226To7yy6ytdPR Q
  • Windows——进程间通信

    进程间通信 进程间通信的概念 Mailslots 关于Mailslots 命名规则 使用 创建 Mailslot 写入 Mailslot 读取Mailslot 管道 关于管道 匿名管道 匿名管道创建 命名管道 命名规则 访问模式 相关操作
  • Spring Boot 多数据源及事务解决方案

    一个主库和N个应用库的数据源 并且会同时操作主库和应用库的数据 需要解决以下两个问题 如何动态管理多个数据源以及切换 如何保证多数据源场景下的数据一致性 事务 本文主要探讨这两个问题的解决方案 希望能对读者有一定的启发 1 数据源切换原理
  • 关于Springboot 无法捕获异常(@Transactional注解导致)

    在工作中发现了一个非常奇怪的事情 就是我突然间捕获不了异常 异常捕获 关于为什么会出现这样的问题呢 经过研究发现 原来是在这个类上 被加上了事务的注解 Transactional 这个事务的注解 就把我的异常给处理掉了 所以在这个被事务注解
  • 使用IntelliJ IDEA创建基于Gradle的kotlin项目

    一 首先打开Idea 选择Create New Project 二 选择Gradle项目并勾选 三 填写项目信息 四 然后一路默认下去就可以了 五 最终创建好的项目如下 六 写个HelloWorld
  • STM32F103ZET6【标准库函数开发】------按键扫描和外部中断的优先级对比

    1 打开正点原子的库函数源码可以看到关于按键的程序有两个 一个是按键输入实验 一个是外部中断实验 从最后体现的效果来看 这两个似乎是一样的 那么如果按键输入和外部中断冲突了 那么哪个优先级比较高呢 今天就来试试 2 首先还是简单介绍 硬件用
  • 什么是数据流图 Data Flow Diagram (DFD)

    什么是数据流图 DFD 如何绘制DFD 一张图片胜过千言万语 数据流图 DFD 是系统内信息流的传统视觉表示 一个整齐而清晰的DFD可以用图形描绘出大量的系统需求 它可以是手动的 自动的或两者的组合 它显示了信息如何进入和离开系统 什么改变
  • Windows Server --- RDP远程桌面服务器激活和RD授权

    RDP远程桌面服务器激活和RD授权 一 激活服务器 二 设置RD授权 系统 Window server 2008 R2 服务 远程桌面服务 注 该方法适合该远程桌面服务器没网络状态下 离线 激活服务器 一 激活服务器 1 打开远程桌面授权管
  • 链表的运用:多项式加法

    通过链表来实现两个多项式的加法 1 创建节点类型 用链表储存多项式则链表的一个节点就代表多项式的某一项 所以一个节点应该包含多项式的系数 多项式的指数以及指向下个节点的指针 2 打印多项式 传入一个指向多项式链表的指针 遍历该链表 依次打印
  • 线性代数的本质——几何角度理解

    B站网课来自 3Blue1Brown的翻译版 看完醍醐灌顶 强烈推荐 线性代数的本质 本课程从几何的角度翻译了线代中各种核心的概念及性质 对做题和练习效果有实质性的提高 下面博主来总结一下自己的理解 1 向量的本质 在物理中的理解是一个有起
  • Qt下实现支持多线程的单例模式

    1 代码介绍 实现单例模式的代码很多 本文的单例模式实现代码是本人一直在工程项目中使用的 现拿出和大家交流分享 本文实现的单例模式 支持多线程 采用双重校验检索的方式 集成析构类 杜绝内存泄漏 稳定性好 使用C Qt的朋友们可以了解一下 不
  • 一、深入理解-Java集合初篇

    导读 本篇文章开始我们将要开始讲解Java集合 包括List Set Map等 也会对HashMap做深入的讲解 通过JDK1 7和JDK1 8两个版本的源码分析一步一步引导大家理解编程思想 同时还会就JDK1 7 JDK1 8两个版本的哈