Java集合——(通俗易懂)

2023-11-09

目录

为什么需要集合

 Collection(单列集合)

 List —— Arraylist

List —— LinkedList

集合的三大遍历方式

Set —— HashSet

Set —— LinkedHashSet

Set —— TreeSet

Map(双列集合)

Map —— HashMap(key,value)

Map —— HashTable

Map —— TreeMap

Map —— LinkedHashMap 

         总结


为什么需要集合

让我们来先思考下为什么需要集合呢?

1. 数组长度固定,一旦确定下来了就不可改变。

2. 数组存放的一组数据类型必须一致(可以是基本数据类型,也可以是引用类型)。

集合的优点:

1. 集合长度是可变的。

2. 集合存放的是引用类型,存放的每个元素都是一个对象。

3. 集合提供了一些列方便的操作对象的方法。

 Collection(单列集合)

 Collection是单列集合的顶层接口,它有两个重要的子接口,分别是List接口和Set接口

list :元素存放按先后顺序,可重复,支持索引。

set :元素唯一性,不可重复,内部排序。

 List —— Arraylist

1 Arraylist底层数据结构是数组

2 Arraylist扩容机制,Arraylist扩容倍数为1.5

3 Arraylist 线程不安全,没有做线程同步,效率高

List list = new Arraylist();
//默认使用无参构造器创建Aarrylist 则它初始化容量是0,第一次添加,则容量扩容为10,
//如果需要再次扩容,每次扩容是之前的1.5倍

List list = new Arraylist(15);
//使用带参构造器创建Arraylist时,第一次扩容则为15,如需再次扩容,则容量为参数的1.5倍

4 Arraylist 常用方法

//演示Arraylist常用方法

List list = new Arraylist();

list.get(int index);
//返回lsit集合中索引对应的元素

list.set(int index,Object element);
//替换索引中对应的元素

list.add(Object element);
//添加元素

list.remove(Object element);
//删除元素

list.remove(int index);
//删除对应索引的元素

list.isEmpty();
//判断集合中是否有该元素,返回类型是Boolean类型 

list.contains();
//判断集合中是否包含该元素,返回类型是Boolean类型

list.indexOf();
//查询该元素第一次出现的索引

list.lastindexOf();
//查询该元素最后出现的索引

list.size();
//返回该集合的元素个数

list.subList(int index,int toIndex);
//截取index到toIndex中的元素(index包含 toIndex不包含)

1 Vector底层数据结构是数组

2 Vector扩容机制 Vector扩容倍数2

//使用无参构造器创建Vector,初始化容量为0,第一次添加容量为10,如需再扩容则容量

是之前的2倍

//使用有参构造器创建Vector,第一次添加容量则为实际传入的参数,如需再次扩容则容量

是之前的2倍

3 Vector 是线程安全的(做了线程同步),效率较低

4 Vetor 和 Arraylist 比较

数据结构 线程安全 扩容倍数
Arraylist 可变数组 不安全

有参构造器,扩容1.5倍

无参构造器,第一次为10

第二次为1.5倍扩容

Vector 可变数组 安全

有参构造器,扩容2倍

无参构造器,第一次为10

第二次为2倍扩容

List —— LinkedList

1 LinkedList底层数据结构是双向列表

2 LinkedList原理

LinkedList维护了两个属性 first 和 last分别指向首节点和尾节点,每个节点(Node)里面又

维护了三个属性(prev,next,item),其中通过prev指向前一个节点,next指向后一个节点形成了双向链表

3 LinkedList 线程不安全,增删快,查询慢

集合的三大遍历方式

 //演示集合三大遍历方式

    List list = new ArrayList();

          list.add(0,"张三");
          list.add(1,"李四");
          list.add(2,"王五");
          list.add(3,"赵六");
          list.add(4,"韩七");

          //使用普通for遍历list集合
          for (int i = 0; i < list.size(); i++) {
               System.out.println(list.get(i));
          }
          //使用增强for遍历list集合
          for (Object o : list) {
               System.out.println(o);
         }
          //使用迭代且遍历list集合
          Iterator iterator = list.iterator();
          while (iterator.hasNext()) {
               Object next = iterator.next();
               System.out.println(next);
          }

Set —— HashSet

1 HashSet 底层实际上是HashMap(数组+链表+红黑树)

2 HashSet 可以存null值 (但只能有一个),元素唯一且无序,没有索引(不能使用普通for遍历)

3 分析HashSet添加元素如何实现唯一性的

添加元素时,会通过hashCode()得出hash值,再通过算法得到索引值,索引位有对象则调用equals()判断是不是同一个对象,是则放弃加入,不是则以链表的方式添加到最后,索引位没对象直接添加。

Set —— LinkedHashSet

1  LinkedHashSet 是HashSet的一个子类

2  LinkedHashSet底层数据结构是LinkedHashMap(数组 + 双向链表)

3  LinkedHashSet是有序且唯一的,底层使用链表维护元素次序,

4  LinkedHashSet非线程安全,效率高

 LinkedHashSet底层维护了一个哈希表和双向链表,每个节点都有两个属性before和after,形成双向链表。

 

Set —— TreeSet

1 TreeSet底层数据结构是二叉树,元素唯一且有序

2 二叉树结构保证了元素的有序性,有两种排序方式 :

 1 自然排序(实现Comparable接口,重写compareTo()方法

 2 定制排序(单独写一个比较器类,实现Comparator接口,重写compare()方法

                                               

 Map(双列集合)

Map(映射集合)是由两个键值对构成的(key , value),键集合是Set类型,值集合是Collection类型(通俗一点就是key不可重复,value可重复)

Map —— HashMap(key,value)

1 Hashmap底层数据结构是数组+链表+红黑树

2 HashMap 扩容机制

3 HashMap线程不安全,效率高 

4 key value 允许为null(且只能一个)可以理解为key为身份证,value就是名字

身份证是唯一的,名字却可以重复。

5 HashMap扩容机制,初始容量162倍扩容

HashMap扩容:第一次添加时,table数组扩容到16,加载因子是0.75,当数组添加到临界值时,就会进行扩容,临界值 = 当前的容量 * 加载因子。扩容倍数为2倍 以此类推使用到了临界值就会进行扩容 。

当 table数组的容量>= 64,且链表的个数= 8 时 ,就会进行树化。

 3 常用方法  

ap map = new HashMap();

        map.put(0, "小白");
        map.put(1, "小红");
        map.put(2, "小蓝");
     
        //获取集合中所有key的元素
        for (Object o : map.keySet()) {
            System.out.println(o);

        }
        //获取集合中所有value的元素
        for (Object value : map.values()) {
            System.out.println(value);
        }
        //获取集合中所有键值对的元素
        for (Object o : map.entrySet()) {
            System.out.println(o);
        }

 

 

Map —— HashTable

1 HashTable线程安全,效率不高(鱼和熊掌不可兼得,提高安全性,牺牲效率)

2 HashTable key 和 value 都不能为null

3 HashTabel扩容机制 初始化容量11,扩容当前容量2倍加1

Map —— TreeMap

1 Treemap底层数据结构是二叉树,支持排序,默认情况下通过Key值的自然顺序进行排序

2 Treemap非线程安全(未做线程同步)

//演示常用方法

//增加元素
 put(key,value);将指定映射放入该TreeMap中

 putAll(Map map);将指定map放入该TreeMap中

//删除元素
clear();清除TreeMap中的所有元素

remove(Object key);从TreeMap中移除指定key对应的映射

//修改元素
replace(key,value);替换指定key对应的value值

//查找元素
boolean containsKey(Object key);判断该TreeMap中是否包含指定key的映射

Map —— LinkedHashMap 

1 LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序

2 LinkeHashMap 非线程安全 允许key,value为null

常用方法

 

     总结

结合业务逻辑选择用适合的容器,实际开发中80%都是查询,我们要对业务进行分析:

1 存储方式 (单列还是双列)

       Collection 单列:

         允许重复(List):

             查询多:

                       单线程: Arraylist 底层数组

                       多线程: Vector 底层数组

             增删多:Linedlist 底层双向链表

        不允许重复(Set):

              无序:HashSet 底层数组+红黑树+链表

              排序:TreeSet 底层二叉树

        Map (key value):

                 键无序:HashMap 底层数组+红黑树+链表

                 键有序:TreeMap底层二叉树

                插入和取出顺序一致:LinkedHashMap 

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

Java集合——(通俗易懂) 的相关文章

  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 有没有好的方法来解析用户代理字符串?

    我有一个Java接收模块User Agent来自最终用户浏览器的字符串的行为需要略有不同 具体取决于浏览器类型 浏览器版本甚至操作系统 例如 FireFox 7 0 Win7 Safari 3 2 iOS9 我明白了User Agent由于
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • @EnableTransactionManagement 的范围是什么?

    我试图了解正确的放置位置 EnableTransactionManagement多个 JavaConfig 上下文的情况下的注释 考虑以下场景 我在 JPAConfig java 和 AppConfig java 中有 JPA 配置以及一组
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 在 AKKA 中,对主管调用 shutdown 是否会停止其监督的所有参与者?

    假设我有一位主管连接了 2 位演员 当我的应用程序关闭时 我想优雅地关闭这些参与者 调用supervisor shutdown 是否会停止所有参与者 还是我仍然需要手动停止我的参与者 gracias 阻止主管 https github co
  • 不兼容的类型:在 java netbeans 中对象无法转换为 String

    我试图在我的项目中使用对象数组 但出现错误 incompatible types Object cannot be converted to String 在这一行 ST1 new String emt1 emt2 emt3 emt4 现在
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 从java中的字符串数组中删除空值

    java中如何从字符串数组中删除空值 String firstArray test1 test2 test4 我需要像这样没有 null 空 值的 firstArray String firstArray test1 test2 test4
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public

随机推荐

  • 曾有一个人,爱我如生命(3)

    第十一章 一切都已结束 不再藕断丝连 我最后一次拥抱你的双膝 说出令人心碎的话语 一切都已结束 回答我已听见 我不愿再一次将自己欺骗 也许 往事终会将我遗忘 我此生与爱再也无缘 普希金 往事 那些天我不知道是怎么熬过来的 什么事都做不下去
  • golang 命令行cobra妙用

    为什么使用命令行 大型项目中少不了数据升级 如果采用web服务 一来不够安全 二来数据量大的时候也会出超时的情况 这时使用命令行是比较合适的方式了 命令行中的MVC web项目一般采用MVC模式 对于命令行有吗 对于命令行则有command
  • Unity——Transform类

    transform position 基础知识 Transform作为Unity中游戏对象最为重要的组件 位置 作为Transfrom组件的一个属性 具有同等重要的地位 Transform组件下有两个 位置 属性 position 指的是游
  • 华为OD机试-报文转换 只有20%通过率。但是没没找到未通过原因

    机试题只有AC20 但是目前没看到原因 我看有人说是16进制的原因 但是输出也是16进制 是不用转换的吧 因为我全部都是用的String 不存在说数据被我转成了10进制 报文转义功能 报文中如果出现0x0A 转义成两个字节0x12 0x34
  • 文件上传漏洞php相关函数

    1 file exists path 检查文件或目录是否存在 参数 描述 path 必需 规定要检查的路径 如果指定的文件或目录存在则返回 TRUE 否则返回 FALSE 2 move uploaded file file newloc 把
  • Delphi2007中提示Application.Exename错误的处理办法

    将application exename改为forms application exename 错误提示
  • 中国各省区块链政策竞争力指数TOP10(2020年10月)

    顺应着国家大力发展区块链的趋势 自2020年以来 全国迎来了区块链政策热潮 中央以及各地方政府纷纷颁布区块链相关政策 此前 链塔智库发布过系列文章 中国区块链50城 通过扫描城市经济发展水平 政府区块链政策及支持力度 区块链投融资事件 区块
  • VUE设置浏览器icon图标

    在创建Vue项目时一般会用默认的项目标题和图标 如下图所示 不是很美观也可能不符合项目的需求 所以有时候就需要改变项目在浏览器上方的标签名称或者图标 找到项目根目录的index html 如图 进去就能够修改title 也就是在浏览器上方的
  • sklearn中ValueError: Unknown label type: ‘continuous‘错误解决

    ValueError Unknown label type continuous 错误解决 今天在做决策树鸢尾花分类时出现了一个错误 解决方法是 train y后加上astype int 即可
  • unity中物体移动到指定位置的四种方法

    法一 使用Vector3 MoveTowards 方法 void Update float step Speed Time deltaTime gameObject transform localPosition Vector3 MoveT
  • vue3.2 之 driver引导页的使用

    目录 vue3 2 之 driver引导页的使用 components driver index vue components driver steps ts 使用 效果 vue3 2 之 driver引导页的使用 安装 yarn add
  • Java一行代码将yyyyMMdd转换为yyyy-MM-dd,yyyy-MM-dd转换为yyyyMMdd

    Java一行代码将yyyyMMdd转换为yyyy MM dd 代码如下 Java日期格式转换记录 yyyyMMdd与yyyy MM dd相互转换 代码如下 yyyyMMdd转换为yyyy MM dd System out println L
  • gtest使用简介

    gtest使用简介 gtest是谷歌开发的开源测试框架 用于帮助c 开发者实现测试用例 使用下来感觉gtest简单实用 基本可以满足各类的测试需求 gtest的使用并不复杂 这里主要是整理一下基本的使用方法和一些实际开发中碰到的问题 通过
  • cuda driver-内存分配

    目录 前言 1 内存分配 前言 统一内存 Unified Memory 统一内存是CUDA中的一种内存管理模型 它将主机 CPU 和设备 GPU 的内存合并为一个统一的内存地址空间 通过使用统一内存 应用程序可以透明地访问主机和设备上的内存
  • 爬虫实战【9】Selenium解析淘宝宝贝-获取宝贝信息并保存

    通过昨天的分析 我们已经能到依次打开多个页面了 接下来就是获取每个页面上宝贝的信息了 分析页面宝贝信息 插入图片 宝贝信息各项内容 从图片上看 每个宝贝有如下信息 price title url deal amount shop locat
  • 【Web API]无法添加AttributeRoutes的解决方案

    1 按照微软官方文档 如果要使用AttributeRoutes 需要在APP START里的WebApiConfig cs的Register方法中添加一行 config MapHttpAttributeRoutes public stati
  • [HNOI2010]弹飞绵羊【LCT】

    题目链接 很明显 如果和下一个弹到的节点连接一条边的话 那么就会形成一棵森林 我们要求的答案实际上就是它父亲节点的个数 1 但是维护一个森林 我们还需要存储每个森林的位置 比较的麻烦了 所以我们不妨开一个点 作为超级点 将所有的森林连接起来
  • 速看!新手入门STM32不知道的概念第一讲:使能、RCC、GPIO与PIN 的区别

    使能 单片机中的使能通常指的是控制某个器件或模块的开关信号 例如 单片机中的GPIO口可以用来控制LED灯的亮灭 其中需要用到一个使能信号 即一个控制LED灯开关的信号 在程序中 通过设置GPIO口的状态 高电平或低电平 来控制LED灯的亮
  • Android最新版本号与API级别对应关系

    Android版本号与API级别对应关系表 名称 版本号 API等级 发布时间 BuildVersion S 12 0 31 R 11 0 30 Q 10 0 29 Pie 9 0 28 2018 08 01 BuildVersionCod
  • Java集合——(通俗易懂)

    目录 为什么需要集合 Collection 单列集合 List Arraylist List LinkedList 集合的三大遍历方式 Set HashSet Set LinkedHashSet Set TreeSet Map 双列集合 M