一、深入理解-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集合初篇 的相关文章

  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • Java Logger 未记录到 Netbeans 中的输出

    我正在 Netbeans 中使用 Maven 启动一个 Java 项目 我编写了一些代码来使用 Logger 类进行日志记录 但是 日志记录似乎不起作用 在程序开始时 我运行 Logger getLogger ProjectMainClas
  • 如何在 JavaFX 中连接可观察列表?

    我所说的串联是指获得一个新列表 该列表侦听所有串联部分的更改 方法的目的是什么FXCollections concat ObservableList
  • 两个整数乘积的模

    我必须找到c c a b mod m a b c m 是 32 位整数 但 a b 可以超过 32 位 我正在尝试找出一种计算 c 的方法 而不使用 long 或任何 gt 32 位的数据类型 有任何想法吗 如果m是质数 事情可以简化吗 注
  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • 如何调试“com.android.okhttp”

    在android kitkat中 URLConnection的实现已经被OkHttp取代 如何调试呢 OkHttp 位于此目录中 external okhttp android main java com squareup okhttp 当
  • Runtime.exec 处理包含多个空格的参数

    我怎样才能进行以下运行 public class ExecTest public static void main String args try Notice the multiple spaces in the argument Str
  • Java 中如何将 char 转换为 int? [复制]

    这个问题在这里已经有答案了 我是Java编程新手 我有例如 char x 9 我需要得到撇号中的数字 即数字 9 本身 我尝试执行以下操作 char x 9 int y int x 但没有成功 那么我应该怎么做才能得到撇号中的数字呢 ASC
  • 如何在 ant 中为 junit 测试设置 file.encoding?

    我还没有完全完成file encoding 和 ant https stackoverflow com questions 1339352 how do i set dfile encoding within ants build xml
  • 提高 PostgreSQL 1 亿数据左连接查询性能

    我在用Postgresql 9 2 version Windows 7 64 bit RAM 6GB 这是一个Java企业项目 我必须在我的页面中显示订单相关信息 有三个表通过左连接连接在一起 Tables TV HD 389772 行 T
  • Java继承,扩展类如何影响实际类

    我正在查看 Sun 认证学习指南 其中有一段描述了最终修饰符 它说 如果程序员可以自由地扩展我们所知的 String 类文明 它可能会崩溃 他什么意思 如果可以扩展 String 类 我是否不会有一个名为 MyString 的类继承所有 S
  • 如何将 HTML 链接放入电子邮件正文中?

    我有一个可以发送邮件的应用程序 用 Java 实现 我想在邮件中放置一个 HTML 链接 但该链接显示为普通字母 而不是 HTML 链接 我怎样才能将 HTML 链接放入字符串中 我需要特殊字符吗 太感谢了 Update 大家好你们好 感谢
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 轻松的反应

    我有一个与这里描述的类似的案例 动态更改RESTEasy服务返回类型 https stackoverflow com questions 3786781 dynamically change resteasy service return
  • hibernate 6.0.2.Final 和 spring boot 2.7.0 的entityManagerFactory bean 未配置问题

    所以最近我想升级我的 Spring Boot 项目项目的一些依赖项 特别是这些组件 雅加达 EE 9 弹簧靴2 7 休眠 6 0 2 Final 完成此操作后 所有更新和代码折射 更新将 javax 导入到 jakarta 以及一些 hib
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • 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两个版本的哈