Java知识点梳理:Collection框架

2023-11-01

java集合类是开发中经常用到的,比如ArrayList、HashMap、HashSet等,下面来系统的说一下。

Collection类图

在这里插入图片描述

Collections与Collection

  • Collection:是一个集合接口,提供了对集合对象进行基本操作的通用接口方法;
  • Collections:是针对集合类的一个包装类,它提供了一系列静态方法实现对各种集合的搜索、排序以及线程安全化的操作,其中的大多数方法都用于处理线性表。

List、Set、Map有序问题

这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。

  • List是按照元素的添加顺序来存储对象的,因此是有序的。他的实现类ArrayList、LinkedList、Vector都是有序的。元素可以重复 (有索引)。 通过元素的equals()方法判断是否重复。
  • Map是无序的,它的存储结构是哈希表<key,value>键值对,map中插入元素是根据key计算出的哈希值来存储元素的,因此他不是按照元素的添加顺序来存储对象的,所以Map是无序的。它的实现类有:HashMap、TableMap和TreeMap。
    其中LinkedHashMap是有序的,hashMap用来保证存储的值键值对,list用来保证插入的顺序和存储的顺序一致。
  • Set是无序的,并且set中的元素不能重复 (没有索引)。set的底层实现其实是Map,它是计算key的哈希值来确定元素在数组中的存放位置,所以是无序的,应为在Map中key的值不能重复,所以set中的元素不能重复。它的实现类有:haseSet、TreeSet。 遍历只能用Iterator迭代器和增强for, 不能使用普通for遍历。
    其中LinkedHashSet是有序的,其中haseSet用来保证数据唯一,List用来保证插入的顺序和存储的顺序一致。

List

ArrayList、LinkedList、Vector

ArrayList与Vector都是便于查找元素,在首末位置增加、删除元素尚可,如若在指定位置删除、增加元素,用LinkedList更高效。

ArrayList与LinkedList都是线程不安全的,Vector是线程安全的。

LinkedList 结构是双向循环链表。

  1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
  2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
  3. 所有的List中可以有null元素,例如[ tom,null,1 ];
  4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。

Set

HashSet、TreeSet

Map

HashMap

HashMap源码和底层结构

HashMap使用的存储结构:

transient Node<K,V>[] table;
 
static class Node<K,V> implements Map.Entry<K,V> {
        final int hash;
        final K key;
        V value;
        Node<K,V> next;
}

HashMap的数据结构,底层是数组,数组中的每一项又是链表。
在这里插入图片描述
HashMap的存取实现:put元素时,根据key的hashCode重新计算hash值,根据hash值得到此元素在数组中的位置(即下标),插入链表。

HashMap为何线程不安全

《Java并发编程的艺术》一书中是这样说的:

HashMap在并发执行put操作时会引起死循环,导致CPU利用率接近100%。因为多线程会导致HashMap的Node链表形成环形数据结构,一旦形成环形数据结构,Node的next节点永远不为空,就会在获取Node时产生死循环。

死循环并不是发生在put操作时,而是发生在扩容时。详细的解释可以看下面几篇博客:
疫苗:JAVA HASHMAP的死循环

ConCurrentHashMap

线程安全,采用分段锁机制,拆分成N个Hashtable的Map。
在jdk1.8之后,采用CAS算法(无锁算法),是一种底层操作系统的算法,效率高。
concurrentLevel=16

HashMap、Hashtable、TreeMap

  • HashMap:允许空键值(key是null可以,value是null也可以),线程不安全,性能上会优于Hashtable;
  • Hashtable:不允许空键值,线程是安全的。其实现如下:
public synchronized V get(Object key) {
       // 省略实现
    }
public synchronized V put(K key, V value) {
    // 省略实现
    }

线程安全的Map:Hashtable,ConcurrentHashMap和synchronized Map

几种线程安全的Map解析

https://blog.csdn.net/BenjaminYoung29/article/details/79317940

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

Java知识点梳理:Collection框架 的相关文章

  • 如何默认将 Maven 插件附加到阶段?

    我有一个 Maven 插件应该在编译阶段运行 所以在项目中consumes我的插件 我必须做这样的事情
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • Java EE:如何获取我的应用程序的 URL?

    在 Java EE 中 如何动态检索应用程序的完整 URL 例如 如果 URL 是 localhost 8080 myapplication 我想要一个可以简单地将其作为字符串或其他形式返回给我的方法 我正在运行 GlassFish 作为应
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • mysql安装出现让输入根密码_MYSQL安装时解决要输入current root password的解决方法...

    在装MYSQL的时候发现要输入current root password不记得以前在电脑里装过 你的系统曾经装过MYSQL在重装就会要求输入原来设定的密码 如果是第一次安装就不会出现 在网上苦苦搜寻解决方法 终归结出以下解决方法 1 清除M
  • 牛逼,玩转 ChatGPT!

    ChatGPT是一种由OpenAI开发的人工智能模型 它可以模拟人类的对话交流 对话可以涉及各种话题 使用ChatGPT可以进行各种操作 例如自然语言生成 文本摘要 语言翻译 文本分类 问答系统等 下面是ChatGPT网站的可用链接 由于网
  • MySQL中存储过程与函数总结

    目录 1 存储过程与函数的概念 2 创建存储过程与函数 2 1 参数列表 3 使用变量 4 定义条件与处理程序 1 定义条件 2 定义处理程序 3 六种定义处理程序的方法 方法一 捕获sqlstate value 方法二 捕获mysql e
  • 介绍一种门限SM2密码方案

    中科院信息工程研究所的科研人员林璟锵 马原 荆继武等设计了一种 SM2 门限密码算法实现方案 他们在 2014 年 8 月向国家知识产权局提交了专利申请 名称是 适用于云计算的基于SM2算法的签名及解密方法和系统 授权公告号是 CN 104
  • 一念天堂

    一念成佛 一念成魔 很多事情就发生在一念之间 很多误会也发生在想说没说出口的一瞬间 虽然误会可能解开 但再也回不回从前 心安在这里给大家讲个故事 也算是给自己提个醒 该说的话一定要说出来 你不说别人永远都不知道 不该说的尽量别说 别人会误会
  • lua协程

    coroution协程 定义协程函数 co coroutine create function a b end 启动协程函数和继续运行 coroutine resume co 10 20 co coroutine wrap function
  • C++&QT实现计算器图形界面交互

    一 实验目的和要求 要求 在实验 03 实验 05的作业内容基础上 1 增加图形交互功能 2 增加3个逻辑运算符 并能处理逻辑运算符和算术运算符的混合运算 3 增加容错功能 能进行异常处理 说明 1 其中牵涉到数据结构相关的可复用代码 可自
  • C++实现——杨辉三角

    打印杨辉三角 include
  • k8s健康检查配置yaml文件编写

    1 就绪检测 apiVersion v1 kind Pod metadata name readiness httpget pod namespace default 放在那个空间下 spec ontainers name readines
  • 如何模拟编写MyBatis之DataSource与Session呢?

    转自 如何模拟编写MyBatis之DataSource与Session呢 下文笔者讲述mybatis之模拟DateSource和Session的方法分享 如下所示 DataSource和Session简介 DataSource 实现标准的j
  • linux sudo命令全称,linux sudo命令的概念与使用

    1 sudo介绍本文引用地址 http www eepw com cn article 201610 305498 htm sudo是linux下常用的允许普通用户使用超级用户权限的工具 允许系统管理员让普通用户执行一些或者全部的root命
  • Docker 之 RUN

    参考 https docs docker com engine reference builder run RUN 有两种形式 RUN
  • python中round(x、2)是什么意思_python中round函数具体使用详解

    round函数是python中的内置函数 它在哪都能用 用于数字的四舍五入 当指定的位数大于 0 返回四舍五入到指定的小数位 当指定的位数等于 0 返回四舍五入到最接近的整数 保留整数部分 当指定的位数小于 0 对整数部分进行四舍五入 返回
  • Go读取Xml标签数据

    目录 目录结构 xzm xml文件 readMysqlXml go代码 效果展示 作者留言 目录结构 xzm xml文件
  • Netty一,Rest风格,Netty的Helloword、

    Rest风格 为一种编码风格 默认约定 NettyHelloword 客户端 和服务器端 服务器端 package com netty c1 import io netty bootstrap ServerBootstrap import
  • 互融云农产品追溯系统:区块链存证技术实现双向可追溯

    农产品溯源是食品溯源中最复杂和最艰难的部分 是指通过采集农产品在生产 加工 仓储 物流等环节的相关数据 建立一个涵盖从初级到深加工各个阶段的可视化农产品信息库 向消费者充分展示产品安全与品质相关信息 实现从农田到餐桌的双向可追溯 农产品需求
  • Unity解析OSM数据,并生成简单模型

    文章目录 一 介绍XML数据格式 二 Unity解析XML数据格式的方法 1 C 自带的方法 2 Unity读取TextAsset方法 三 OSM数据介绍 四 Unity解析OSM数据 1 定义node和way的数据结构 2 获取XML文件
  • 辐射定标、大气校正

    辐射校正 指在光学遥感数据获取过程中 产生的一切与辐射有关的误差的校正 包括辐射定标和大气校正 三者关系如图 大气校正的准备过程为辐射定标 表观反射率 表观反射率就是指大气层顶的反射率 辐射定标的结果之一 大气层顶表观反射率 简称表观反射率
  • vue键盘按下事件_vue修饰符可能是东半球最详细的文档(滑稽)

    前端媛猿 读完需要 8 分钟 速读仅需 5 分钟 作者 李大雷 https segmentfault com a 1190000016786254 为了方便大家写代码 vue js给大家提供了很多方便的修饰符 比如我们经常用到的取消冒泡 阻
  • Java知识点梳理:Collection框架

    java集合类是开发中经常用到的 比如ArrayList HashMap HashSet等 下面来系统的说一下 Collection类图 Collections与Collection Collection 是一个集合接口 提供了对集合对象进