想要了解集合,首先要知道一个东西,叫数据结构。所谓数据结构,其实就是计算机存储,组织数据的方式。

常用的数据结构有8大类

数组,链表,树,堆,栈,队列,哈希表,图

在集合中比较常见的是数组链表红黑树

什么是集合

Java 集合(Collection)是 Java 提供的一套用于存储和操作多个对象的框架,位于java.util包下。它替代了传统的数组,提供了更灵活、功能更丰富的数据结构,以及便捷的操作方法。

Java 集合两大体系CollectionMap

Collection是单列集合单列集合元素存储方式就是一个个元素存储

Collection 接口的主要子接口

  1. List:有序、可重复的集合
    List最大的特点就是存储的元素是有顺序的,并且可以存储重复的元素

    • ArrayList:基于动态数组实现,查询快,增删慢
    • LinkedList:基于双向链表实现,增删快,查询慢
    • Vector:线程安全的动态数组(古老类,效率较低)
  2. Set:无序、不可重复的集合
    Set最大的特点就是存储的元素是无顺序的,并且不可以存储重复的元素

    • HashSet:基于哈希表实现,无序,查询快
    • LinkedHashSet:继承 HashSet,维护元素插入顺序
    • TreeSet:基于红黑树实现,元素有序(自然排序或定制排序)
  3. Queue:队列,通常按 FIFO(先进先出)原则操作

    • LinkedList:可作为队列使用
    • PriorityQueue:优先级队列,元素按优先级排序

    Map是双列集合双列集合元素存储方式是以key,value键值对的方式进行存储

    Map 接口的主要实现类

    • HashMap:基于哈希表实现,无序,查询快
    • LinkedHashMap:继承 HashMap,维护键值对的插入顺序
    • TreeMap:基于红黑树实现,键有序
    • Hashtable:线程安全的哈希表(古老类,效率较低)
    • ConcurrentHashMap:线程安全的 HashMap,并发性能好

    ArrayList和LinkedList和Vector

    ArrayList底层的数据结构是数组,而LinkedList底层的数据结构是链表

    Vector支持线程同步,是线程访问安全的,ArrayList线程不安全 。

    数组的特点就是通过索引来查询数据,因此查询数据速度比较快,而因为数组的内存空间是连续性的因此在添加数据和删除数据的时候,因此效率没这么快

    链表的特点就是内存空间不是连续性的,因此查询的时候需要遍历检索,效率没这么高,而元素的底层是由prev,元素和next三部分组成的节点。因此在增删数据的时候只需要把节点的next,断开原本的prev,然后连接新的prev,因此无需移动元素,效率更高,被断开的节点会慢慢地被gc回收

    ArrayList动态扩容

    ArrayList默认数组的大小为10,扩容的时候采用的是采用移位运算

    ArrayList的扩容因子为1.5

    ArrayList和LinkedList的使用场景

    在工作中对元素进行增删操作时使用LinkedList,而进行查询的操作使用的是ArrayList

    ArrayList底层结构是基于数组,因为数组最大的特点就是有索引作为下标,查询时比较方便快捷,但在增删操作时要进行元素位置的移动,因此效率比较慢。

    LinkedList的底层结构基于链表,查询的时候回通过这般搜索的方式进行查找因此效率会比较慢,

    但在增删操作时只需要将链表节点的头尾指针进行修改即可,因此效率会比较快。

    在ArrayList中访问元素的最糟糕的时间复杂度是O(1),而在LinkedList中可能就是O(n)了。在ArrayList中增加或者删除某个元素时候,如果触发到了扩容机制,那么底层就会调用到System.arraycopy方法,被native修饰,该方法会直接通过内存复制,省去了大量的数组寻址访问等时间。但是相比于LinkedList而言,在频繁的修改元素的情况下,选用LinkedList的性能会更加好一点

    如果去学习过jvm的话,应该会对“内存碎片“这个名词比较熟悉。

    基于数组结构的数据在存储信息的时候都需要有连续的内存空间,

    所以如果当内存碎片化情况较为严重的时候,可能在使用ArrayList的时候会有OOM的异常抛出。

    复制某个ArrayList到另一个ArrayList中去

    • 使用clone()方法,比如ArrayList newArray = oldArray.clone();
    • 使用ArrayList构造方法,比如:ArrayList myObject = new ArrayList(myTempObject);
    • 使用Collection的copy方法。

    fail-fast机制

    在ArrayList设计的时候,其实还包含有了一个modCount参数,

    这个参数需要和expectedModCount 参数一起使用,expectedModCount参数在进行修改的时候会被modCount进行赋值操作,

    当多个线程同时对该集合中的某个元素进行修改之前都会进行expectedModCount 和modCount的比较操作,

    只有当二者相同的时候才会进行修改,两者不同的时候则会抛出异常。

    COW容器

    jdk1.5之前,由于常用的ArrayList并不具有线程安全的特性,因此在1.5之后的并发包里面出现了CopyOnWrite容器,简称为COW。

    通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。

    这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。

    所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器。

    并发包juc里面的CopyOnWriteArrayList中,核心原理主要是通过加入了ReentrantLock来保证线程安全性,从而解决了ArrayList的线程安全隐患问题。

    集合的选择建议

    1. 需要有序可重复:选择ArrayList(查询多)或LinkedList(增删多)
    2. 需要无序不可重复:选择HashSet
    3. 需要排序的集合:选择TreeSet(元素)或TreeMap(键)
    4. 需要键值对存储:选择HashMap(一般情况)或LinkedHashMap(需顺序)
    5. 多线程环境:考虑使用ConcurrentHashMap等线程安全集合

    集合的常用操作

    • 添加元素:add()(Collection)、put()(Map)
    • 删除元素:remove()
    • 查找元素:contains()
    • 获取大小:size()
    • 清空集合:clear()
    • 遍历元素:增强 for 循环、迭代器(Iterator)

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

    如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    大模型——深度评测智能体平台Coze Studio

    深度评测智能体平台Coze Studio 7 月底字节跳动的 Coze-Studio 正式开源,算是 AI 智能体领域的一个大事件。这个月终于有时间在内网环境进行了部署和评测,希望能为团队的企业知识库和 AI 应用建设提供多一个选项。 其实,我们厂的知识库系统一直是自研的。没有直接采用市面…

    UE5打包,LoadObject加载不出网格|动画

    由于笔者UE5加载模型和动画使用的动态加载(LoadObject),而这些资源(XX001、XX002 等)没有被任何关卡或蓝图直接引用,在编辑器状态下是可以正常加载的,但它们在打包时被当作“无用”资源而排除了…

    C 语言标准输入输出头文件stdio.h及其常见用法

    在这篇文章中,我们来详细聊一聊 C 语言标准输入输出头文件 stdio.h 及其常见用法。1. stdio.h 是什么 stdio.h(Standard Input and Output Header)是 C 标准库中的一个头文件,提供了处理标准输入输出和一些文件操作的函数声明。 它…

    Js逆向 拼夕夕anti_content

    前言 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!本文章未经…

    大模型时代为什么需要向量数据库?

    这里写自定义目录标题1. 向量数据库2. 向量嵌入3. 特征和向量4. 相似性测量4.1 欧几里得距离4.2 余弦相似度5. 相似性搜索5.1 K-Means5.2 基于文本嵌入进行意图匹配6. 问答助手7. 意图匹配1. 向量数据库 向量数据库(Vector Database),也叫矢…

    【Canvas与旗帜】二十角金盘德国旗

    【成图】【代码】<!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>多角金盘德国旗 Draft1</title><style type"text/css&qu…

    Linux软件编程:总结

    一、Linux系统概述&#xff08;一&#xff09;Linux系统概述&#xff08;二&#xff09;Linux系统简介1.常见的Linux系统&#xff1f;2.Linux操作系统是操作系统的核心&#xff0c;也成为内核&#xff0c;内核的主要功能&#xff1f;3.shell是操作系统的外壳&#xff0c;主要作…

    【51单片机学习】直流电机驱动(PWM)、AD/DA、红外遥控(外部中断)

    一、直流电机驱动&#xff08;PWM&#xff09;1.直流电机介绍步进电机的旋转速度完全由编码的通电时间决定的&#xff0c;可以用于精密控制。 舵机内部是一个直流电机加一个控制器&#xff0c;引出三根线&#xff0c;分别是正负极和编码线&#xff0c;根据输出电平的时间来控制…

    ComfyUI Portrait Master肖像大师中文版

    本文转载自&#xff1a;ComfyUI Portrait Master肖像大师中文版 - Hello123工具导航 ** 一、产品定位与技术架构 肖像大师中文版是专为 AI 绘画工具设计的提示词生成插件&#xff0c;通过结构化参数控制实现精准人物肖像生成。它基于 ComfyUI 平台开发&#xff0c;提供 193 国…

    (Redis)内存淘汰策略

    1. 为什么需要内存淘汰策略&#xff1f;Redis 是一个基于内存的高性能数据库&#xff0c;所有数据都存储在内存中。优点&#xff1a;读写速度极快。缺点&#xff1a;内存有限&#xff0c;存满之后如果继续写入&#xff0c;就必须有一套策略来决定“删掉谁&#xff0c;留下谁”。…

    Eclipse 里Mybatis的xml的头部报错

    需要进行Eclipse 配置 MyBatis 的DTD文件Window -> Preference -> Maven -> 勾选 (download artifact javadoc).

    SpringBoot Web快速入门_从零搭建你的第一个Web应用

    在 Java 企业级开发领域&#xff0c;SpringBoot 以其 “约定优于配置” 的理念彻底革新了传统 Spring 应用的开发模式。根据 2023 年 JetBrains 开发者调查报告&#xff0c;超 65% 的 Java 开发者将 SpringBoot 选为 Web 开发的首选框架。其优势显著&#xff1a;快速启动&#…

    手持 Mid360 + RealSense 相机 + Jetson Orin 一体平台

    这篇博客是我们开源的一个项目介绍&#xff0c;包括3D结构件 STP 文件与常见 SLAM 工程在 Arm 设备上编译手册等&#xff0c;将 Livox Mid360、Realsense 相机、Nvidia Jetson Orin、定制电池放在了一个手持设备上&#xff0c;同时这个手持设备预留了底部螺纹孔&#xff0c;当你…

    H7-TOOL固件2.31发布,支持250M示波器,支持IAR下载算法加载运行,上位机支持UTF-8编码,增加多款脱机烧录芯片支持

    【PC软件】V2.3.1 1. 脱机烧录功能更新: - 添加芯片: - 自动填充文件名、Flash地址、Flash大小、SRAM地址和SRAM大小 - FLM算法文件不支持自动填写文件名&#xff0c;当生成文件后需要手动更新 - 厂商列表栏鼠标右键菜单可复制厂商名 - 修复添加芯片排列次序的问题…

    自然语言处理——06 迁移学习(上)

    1 fasttext工具介绍 1.1 介绍 fasttext 是 Facebook AI Research&#xff08;FAIR&#xff09;开发的开源 NLP 工具包&#xff0c;专门用来解决文本相关任务&#xff0c;比如情感分析、文本分类&#xff08;判断新闻属于体育/财经等&#xff09;、识别“人名/地名”这类实体&a…

    数据库MVCC是什么

    问题数据库MVCC是什么我的回答MVCC&#xff0c;全称是"多版本并发控制"(Multi-Version Concurrency Control)&#xff0c;是数据库管理系统中常用的一种并发控制技术。说白了&#xff0c;它就是通过维护数据的多个版本&#xff0c;让读操作不会被写操作阻塞&#xff…

    游戏广告投放数据分析项目:拆解投放的“流量密码”

    用数据说话&#xff1a;1441条投放记录拆解游戏广告投放的“流量密码”一、数据概况 & 处理思路 先放一张数据全家福&#xff0c;字段 13 个&#xff0c;样本 1441 条&#xff0c;缺失值 0&#xff0c;只做了一件事&#xff1a;把“未知大小”“无”等脏数据清洗掉。 impor…

    数据库服务语句应用

    文章目录&#x1f31f;数据库语句应用介绍&#x1f340;数据库语句分类介绍DDL&#xff08;Data Definition Language&#xff09;数据定义语言DCL&#xff08;Data Control Language&#xff09;数据控制语言DML&#xff08;Data Manipulation Language&#xff09;数据操作语…

    解释器模式与布尔表达式的C++实现

    详细探讨一下解释器模式(Interpreter Pattern)以及如何使用它来实现一个简单的布尔表达式求值器。 第一部分:解释器模式详解 1. 模式定义与意图 解释器模式是一种行为设计模式,它给定一个语言,定义其文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中…

    ELK 重难点解析以及最佳实践

    ELK 重难点解析以及最佳实践 目录 ELK简介核心组件详解使用技巧重难点解析Spring Boot集成具体场景使用最佳实践 ELK简介 什么是ELK ELK是一个开源的日志分析平台&#xff0c;由三个核心组件组成&#xff1a; Elasticsearch: 分布式搜索引擎&#xff0c;用于存储和检索日…