JAVA常用集合实现方式的总结

【纯血鸿蒙】安装hdc工具 参考资料: 阅读详情

    文章开始之前,首先简单回顾一下数据结构中定义的物理结构和逻辑结构。

    物理结构:

  • 顺序存储结构
  • 链式存储结构

    逻辑结构

  • 线性结构:一般线性表、栈、队列、字符串、数组、广义表
  • 非线性结构:树、图

    关于集合命名规则,Java中集合的命名大体上可以归类为AbEf的形式:  Ab代表物理结构,Ef代表逻辑结构,但是这只是对于大多数的集合名有效。如ArrayList,就是用数组实现线性表;而LinkedList就是用链表实现的线性表。

    最后补充一个必知的native方法:

  • arraycopy()@java.lang.System.class
  • public static native void arraycopy(Object src,  int  srcPos, Object dest, int destPos, int length);
  • 功能:将src中的srcPos~srcPos+length-1的数据复制到dest中的destPos~destPos+length-1位置处;

 

顺序存储结构实现的集合(即数组实现)

A、B、C、D是按照底层实现的相似性进行划分的

PartA-线性表&栈

ArrayList:

  • 内部存储了一个Object[];提供随机访问;
  • ArrayList中数据的移动大多是利用System.arraycopy();方法实现,该方法是native方法;
  • 扩容;
    • 默认大小是10;
    • 最大容量Integer.MAX_VALUE - 8;
    • 扩容触发条件:当前要求容量大小大于当前容量大小
    • 正常扩容newCapacity = oldCapacity + (oldCapacity >> 1);
    • 使用System.arraycopy将数据全部移动到新的数组中
  • 缩容:手动调用trimToSize()方法,会缩到当前数组实际存储的数据大小

Vector:

  • Vector与ArrayList共同点
    • 两者实现的功能相同,方法的实现也基本一致;
    • 都具有SubList内部类和Itr迭代器内部类
    • 都能够扩容和缩容
  • Vector与ArrayList区别:
    • 线程安全:Vector对大部分的方法使用了关键字Synchronized声明
    • 额外的%element%方法:这些方法会被Stack类所使用;

Stack:

  • Stack主要使用的是Vector<E>的方法进行具体的实现,自身没有状态量
  • 线程安全:继承Vector,故也是线程安全的
  • pop方法:使用elementAt+removeElementAt
  • push方法:使用addElement
  • search方法:从后往前搜索调用lastIndexOf

 

PartB-队列

ArrayDeque:

  • 存储有一个Obejct[]数组;数组长度必须是2的幂次,因为这样就方便取余运算;
  • 有一个head和tail指针;
  • tail =(tail+1)&(elements.length-1)
  • head =(head+1)&(elements.length-1)
  • size = (tail-head)&(elements.length-1)
  • 扩容:
    • 正常扩容后大小为原数组长度2倍
    • 利用System.arraycopy方法实现

PriorityQueue:

  • 类中存储有一个Object[]数组
  • size为当前数组中存储的数据的大小
  • 存入的数据类型要求实现了Comparable接口
  • 数据的添加和删除操作伴随着调堆的操作;
  • 具有扩容功能:
    • 扩容大小:当前大小的2倍或者1.5倍
    • 扩容条件:准备存入的数据量大于当前Obejct数组的长度;

 

PartC-Map

HashMap:

  • 内部存储了一个Node<K,V>[] table;
  • 内部有定义一个Node内部类和TreeNode内部类;后者是一颗红黑树
  • 数组的下标(散列值)等于hash(key)&n-1;
  • 会自动扩容:
    • 默认大小是16;大小必须为2的幂
    • 最大容量是1<<30
    • 填装因子为0.75
    • 扩容触发条件:一旦当前存储数据大于门限(容量*填装因子)
    • 正常扩容newCapacity = oldCapacity<<1;
    • 每个桶中的数据分成两拨一波继续留在原散列值下面,一波移动到原散列值+oldCapacity位置处
  • 不能自动减容;
  • 红黑树的利用:
    • 当一个桶中的元素大于某个固定值,则将该桶中的数据由链表存储结构,转换成红黑树存储结构;
    • 在此之后的所有操作交由红黑树进行处理;
    • 在扩容的时候,对红黑树进行拆分的过程中,如果最后元素个数小于固定值,则将红黑树存储结构转换为普通链表存储结构

HashTable:

  • 基本与HashMap类似;
  • 线程安全:HashTable的大部分方法使用了Synchronized关键字进行标记
  • 没有红黑树:HashTable对桶中数据的存储没有使用红黑树,因此效率相对于hashmap会差一点
  • 不支持存储null:会抛出异常

HashSet:

  • 内部存储了一个HashMap<E,Object>变量
  • 一个简单版本的HashMap;
  • 只使用了key而没有使用value部分,value永远存的都是固定的Object

 

PartD-String

String

  • 内部存储的是一个final char[]字符数组;
  • 因此不能修改它指向的字符数组

StringBuidler

  • 内部存储的是一个char[]字符数组
  • 因此可以修改里面的字符
  • 对于数组的拷贝大多依赖于System.arraycopy的方法
  • 扩容
    • 默认大小为16
    • 容量最大值:Integer.MAX_VALUE
    • 正常情况扩容大小:int newCapacity = value.length * 2 + 2;
    • 扩容触发条件:准备存储的字符数大于当前数组的长度
  • 缩容:
    • 为当前存储数据的大小

StringBuffer

  • 与Stringbuilder类似
  • 线程安全:方法大多使用了Synchronized关键字标记

链式存储结构实现的集合(即链表实现)

A、B是按照底层实现的相似性进行划分的

PartA-Map

TreeMap:

  • 定义了一个内部类Entry<K,V>;该节点定义了这课红黑树的存储结构;
  • 存储有该树的根节点;要删除这颗树只需要将root指向null即可;GC之后便会回收该红黑树,造成其它节点的引用不可达
  • 每次插入、删除一个树中节点时;都需要对这颗红黑树进行一定的调整;

TreeSet:

  • 内部存储了一个TreeSet<E,Object>对象
  • 一个简单版本的TreeMap;
  • 只使用了key而没有使用value部分,value永远存的都是固定的Object

 

PartB-List&Map

LinkedList:

  • 内部存储一个双向链表;所有的操作都是对该链表进行操作 

LinkedHashMap:

  • 数据存储是HashMap只是有在其上面加了一个链表结构,每次对该HashMap中的数访问一次都会改变链表结构;保证链表中的最后面的数据是最近刚被访问的那个节点的数据。具有LRU算法特性

转载:http://blog.youkuaiyun.com/evan_man/article/details/50835507

10分钟训练你的AI歌手:RVC WebUI声音克隆保姆级教程 本文提供了一份详细的RVC WebUI声音克隆保姆级教程,指导用户如何在10分钟内利用Retrieval-based-Voice-Conversion技术训练专属AI歌手。教程涵盖从环境配置、数据准备、模型训练到最终推理应用的全流程,即使是新手也能快速上手,实现高质量的声音克隆与歌曲生成。 阅读详情

相关推荐

docker安装fastdfs+nginx配置

docker安装fastdfs+nginx,实现图片或文件的上传与下载

weixin_47325126的博客 2193

java常用的几种集合类以及实现方法

目录集合类图List集合Set集合Map集合 在UML类图中,常见的几种关系:基本的遍历循环方法 ArrayList删除方法

qq_64001795的博客 2365

WRF移动嵌套结合伏羲模型与CFD(PALM)高精度多尺度降尺度分析研究

WRF移动嵌套(Moving Nesting):动态调整高分辨率嵌套网格位置,追踪天气系统(如台风、强对流系统)以提高局地预报精度。伏羲(Fuxi)模型:国产数值模式,提供对WRF模拟的初始及边界条件优化。CFD(Computational Fluid Dynamics)PALM模型:精细化局地流场、湍流、温度分布。

m0_57411304的博客 1716

java集合之List接口实现类常用方法详解

java.util.List接口继承自Collection接口,是单列集合的一个分支,通常将实现了List接口的对象称为List集合,在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过元素的索引下标来访问集合中的指定元素,另外List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致List接口常用方法列表说明详见java集合之Collection接口体系-优快云博客。

1656

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 705

Obsidian免费同步全攻略:手把手教你用OneDrive+Remotely Save插件跨设备同步笔记

本文提供了一份详细的Obsidian免费同步方案指南,核心是利用OneDrive云存储与Remotely Save插件实现跨设备笔记同步。文章手把手教学,涵盖插件安装、OneDrive授权配置、桌面端与移动端的同步设置,并解答了常见问题,帮助用户在不依赖官方付费服务的情况下,构建稳定、自主的免费同步工作流。

bash7scripter的博客 849

java集合详解(长达两万字)

collection接口和Map接口详解(包含底层源码解析)

晚笛的博客 9126

【社区分享】从零开始学习 TinyML,建立 TensorFlow 深度学习模型(技术优化篇)

本文来自社区投稿与征集,作者王玉成,ML&IoT Google Developers Expert,温州大学智能锁具研究院总工程师。 了解更多:https://blog.youkuaiyun.com/wfing 经过前面几章的讨论,我们了解了TinyML 的概念,完成了一个最简单的TinyML 的模型并且运行在微控制器上,得出最基本的结果。但是在实际的工程应用中,模型建立之后,也需要再进一步结合许多优化方面的技术,这就是我们接下来想要探讨的。 5. 优化 TinyML 这本书也详细的向我...

tensorflowforum的博客 1万+

java详解 --- 集合之数组实现和链表实现

一.List 在说数组实现和链表实现之前,先说说它们的”父亲” — List List是可以有重复的数据存储的,按照顺序存储的,有下标. List的特有方法: 1.添加 – add(int num,Object obj) 2.替换 – set(int num,Object obj) 3.获取 – get(int num) 4.删除 – remove(int num)

月牙湾的博客 1211

ICC2: pin shape不在track上引起的drc如何解决?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 434

MATLAB - 使用 RRT 进行挖掘机运动规划

本例演示了如何使用运动规划器在包含障碍物的环境中为挖掘机规划路径。在此示例中,您将以运动树的简化形式为挖掘机建模,然后使用基于采样的运动规划器确定挖掘机在存在障碍物的两个姿势之间的可行路径。在 Simscape™ 多体™ 模型中模拟结果。

机器人控制与仿真应用 1850

java map集合,体系特点常用方法;遍历方式,键值对;遍历方式-lambda;综合案例和map集合实现类

Java Map集合体系详解:Map是存储键值对的接口,主要实现类包括无序的HashMap、有序的LinkedHashMap、排序的TreeMap,以及线程安全的Hashtable和ConcurrentHashMap。Map的特点包括键唯一值可重复、无索引访问、对null值的不同支持策略。常用方法有put、get、remove等,遍历方式包括键遍历、值遍历、entrySet遍历等。底层实现上,HashMap采用数组+链表+红黑树结构,TreeMap基于红黑树实现排序。线程安全场景推荐使用Concurrent

DeppBing的博客,全栈修炼记|记录一个开发者的进化轨迹 335

【AI智能体】QClaw 对接GitHub处理自动化任务实战操作详解

QClaw 对接GitHub处理自动化任务实战操作详解

congge 4869

java基础——java集合set详解

本文深入探讨了Java中的Set接口及其主要实现类,包括HashSet、LinkedHashSet和TreeSet。Set接口的核心特性是元素唯一性,适用于数据去重、成员检查等场景。文章详细介绍了Set的常用方法,如add、remove、contains等,并通过代码示例展示了如何使用这些方法。此外,文章还对比了不同Set实现类的特点和使用场景:HashSet适用于快速查找和插入,LinkedHashSet保持插入顺序,TreeSet则支持自动排序和范围查询。最后,文章总结了Set的三种主要遍历方式(增强型

qq_47980550的博客 4582

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java集合之Map集合

java中集合分为两大类,第一类是set集合和list集合是Collection接口的实现接口,第二类是map集合,也是一个接口。对于Map集合我们需要知道,它是一个存储键值对的集合,和List、Set只能存放单个引用元素不同,它内部可以存放一个键值对。boolean containsValue(V): 判断值是否存在。V remove(K): 根据键删除整个键值对。3.value(值)无序,无下标,可以重复。旧V put(k,v): 添加一个键值对。V get(K): 根据键获取值。

qq_52747920的博客 915

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java基础(集合)

boolean containsAll(List|Set集合名): 判断当前集合是否包含参数集合的所有元素。boolean addAll(下标,List|Set集合名): 将参数集合元素添加到当前集合指定下标位置。boolean addAll(List|Set集合名): 将参数集合元素添加到当前集合末尾。while (it.hasNext()) {//循环条件: 有下一元素。集合名.forEach(new Consumer<集合泛型>() {//可以通过 集合名.get(i) 获取当前集合元素。

m0_67244960的博客 1041

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java集合之List集合

首先,我们需要知道List并不是一个类而是一个Collection的子接口,如果我们想要使用List集合,那么我们需要使用List接口对应的实现类。利用集合的foreach方法,传入一个Consumer的接口实现类对象。2.元素有下标-可以通过下标来访问集合中元素。1.元素有序-元素存放和取出顺序一致。子遍历过程中无法使用累加器和标识变量。3.元素可以重复-可以存放相同元素。这种方法可以使用Lambda来简化。只有下标遍历过程中可以增加删除元素。这种方法需要先创建迭代器对象。

qq_52747920的博客 445

JAVA List集合

List是 Java 中最常用的集合类型之一,适合需要有序存储且允许重复元素的场景。根据具体需求选择合适的实现类(如ArrayList或LinkedList),并掌握遍历、排序等常用操作,能有效提升代码效率。如何在 List 中进行元素删除操作?遍历 List 集合有哪些方式?List 和 Set 有什么区别?

2502_90671534的博客 474

Java中List系列集合详解

场景推荐集合原因高频查询、静态数据ArrayList数组结构支持快速随机访问频繁增删(尤其是首尾操作)LinkedList链表操作效率高,支持队列/栈多线程环境线程安全且读操作无锁(写时复制机制)示例代码参考ArrayList默认初始容量10,扩容时增加50%LinkedList的addFirst()和pollLast()可模拟队列通过合理选择集合类型和遍历方式,可显著提升程序性能。

ze15829163918的博客 712

【Java第58集】java Map双列集合详解

Java的Map是集合框架中的核心接口之一,用于存储键值对(Key-Value Pairs),通过键(Key)快速查找对应的值(Value)。与List和Set不同,Map是一种双列集合键(Key)的唯一性:同一个Map中不能有两个相同的键。值(Value)的可重复性:不同的键可以映射到相同的值。键值对的无序性(除非使用特定实现类如或TreeMapHashMap:高性能、无序、允许null。TreeMap:按键排序。:保持插入顺序或实现 LRU 缓存。:高并发环境下的线程安全。

学不可以已,活到老,学到老。 1211

Map集合

Collection(2)

2401_83641824的博客 611

JAVA API和集合

JAVA API什么是java api常用的APIIO API线程APISocket API集合API集合框架的分类以上三种集合的使用集合的继承结构List集合List集合常用的API集合空 什么是java api java api: application interface 应用程序接口 JAVA API是java开发团队实现做好的类库 类库:就是一些java类的集合,是一些功能的集...

AirDean的博客 790

Java集合框架基础知识点全面解析

本文介绍了Java集合框架的核心内容,主要分为单列集合(Collection)和双列集合(Map)两大类。重点解析了Collection接口及其子类型List和Set的特点与常用方法,包括三种遍历方式(迭代器、增强for循环、Lambda表达式)及其区别。详细说明了List集合特有的索引操作方法,如add(index,element)、remove(index)等。文章还通过代码示例展示了ArrayList的基本使用方式,包括添加、获取和修改元素等操作。

2402_88461821的博客 901

Java集合

HashMap:无序,不重复,无索引。LinkedHashMap:有序,不重复,无索引。TreeMap:按照大小默认升序排序,不重复,无索引。

Doctor_Anonymous的博客 665

【Java集合的使用以及部分底层实现】

无论前方等待我们的是什么,让我们保持勇气和决心,一路向前!

weixin_63309304的博客 1092

JAVA集合Collection常用方法详解

提到集合就不得不提一下数组,好多集合底层都是依赖于数组的实现。数组一旦初始化后,长度就确定了,存储数据对象不能达到动态扩展,其次数组存储元素不便于对数组进行添加、修改、删除操作,而且数组可以存储重复元素。这个时候集合对作用显现出来了。集合分为Collection和Map两种体系。下面先介绍Collection的集合类的继承树如下图所示:单列集合只能一次添加一个数据双列集合可以一次添加2个数据。

weixin_65752158的博客 3716
上一篇: Spark:内存管理模型及架构
下一篇: 缓存
DPnice
博客等级 码龄9年 38粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值