java集合的数据结构与元素有序性

【IxNetwork】史上最全IxNetwork测试仪使用精讲(一),图文教程超赞超详细!!! IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试; 阅读详情

目录

 

1.引言

2.总结

 3.java集合概述

3.1 ArrayList

3.2 LinkedList

3.3 Vector

3.4 HashMap

3.5 LinkedHashMap

3.6 TreeMap

3.7 Hashtable

3.8 HashSet

3.9 LinkedHashSet

3.10 TreeSet


1.引言

本文是对常见的java(1.8)集合的一些总结,不足之处,欢迎看官们在评论区纠正。

2.总结

^_^,先放大招

 3.java集合概述

java集合框架图,摘自菜鸟教程:https://www.runoob.com/java/java-collections.html

3.1 ArrayList

最常用的集合之一。

底层数据结构为数组,数组的默认初始容量为10,当数据的大小大于10的时候,会进行自动扩容,新的容量为旧的容量的1.5倍。

ArrayList的元素可以存在重复,默认情况下元素的输入顺序与输出顺序一致。

可自定义元素比较器,修改元素输出顺序。

public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(3);
        arrayList.add(4);
        arrayList.add(2);
        arrayList.add(5);
        arrayList.add(1);
        arrayList.add(2);
        System.out.println(arrayList); // [3, 4, 2, 5, 1, 2]
        arrayList.sort((p, n) -> n - p);
        System.out.println(arrayList); // [5, 4, 3, 2, 2, 1]
    }

3.2 LinkedList

LinkedList类是双向链表,链表中的每个节点都包含了对前一个和后一个元素的引用。

与ArrayList类似,元素可以存在重复并且默认输出元素顺序和输入元素顺序一致。可自定义比较器用于实现元素输出顺序

LinkedList与ArrayList因为数据结构不同,所以在读写性能上也不一样,LinkedList适用于更多的写入与删除场景下,ArrayList则适用于读取较多的场景。

public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        linkedList.add(3);
        linkedList.add(4);
        linkedList.add(2);
        linkedList.add(5);
        linkedList.add(1);
        linkedList.add(2);
        System.out.println(linkedList); // [3, 4, 2, 5, 1, 2]
        linkedList.sort((p, n) -> n - p);
        System.out.println(linkedList); // [5, 4, 3, 2, 2, 1]
    }

3.3 Vector

Vector继承AbstractList类,实现了List接口,因为在操作方法上都加上了同步锁,是一个相对线程安全的集合。

虽然Vector可以保证单个方法线程安全,但是对于复合操作的查询却并不能做到线程安全,需要调用方自己以Vector为锁来进行操作。

Vector可以再初始化的时候设置扩容参数capacityIncrement,如果在构造方法中设置了capacityIncrement > 0,那么新数组长度就是原数组长度 + capacityIncrement,否则新数组长度就是原数组长度 * 2。

与ArrayList类似,元素可以存在重复并且默认输出元素顺序和输入元素顺序一致。可自定义比较器用于实现元素输出顺序

public static void main(String[] args) {
    Vector<Integer> vector = new Vector<>();
    vector.add(3);
    vector.add(4);
    vector.add(2);
    vector.add(5);
    vector.add(1);
    vector.add(2);
    System.out.println(vector); // [3, 4, 2, 5, 1, 2]
    vector.sort((p, n) -> n - p);
    System.out.println(vector); // [5, 4, 3, 2, 2, 1]
}

3.4 HashMap

底层由 数组+链表+红黑树 实现,

HashMap的增加操作:根据key的hash值计算出一个值,该值当做数组的下标存入到数据。但是如果发现数组中该下标已经有值的存在(hash碰撞),那么旧值和新值则组合成链表存放于该下标上。链表长度超过8则进行判断,如果数组长度小于64那么进行扩容,否则就同一下标的链表转为红黑树。当HashMap进行resize的时候,发现某个数的元素小于等于6,那么会执行untreeify操作,把树再次转为链表。

HashMap内部由 Node<K,V> 数组保存数据,数据的下标是由key的hash得到,因此HashMap不支持自定义排序,并且输出顺序由 key 的hash值决定,所以输出元素的顺序和输入元素顺序无关,因此HashMap不是有序的。

public static void main(String[] args) {
    HashMap<String, String> hashMap = new HashMap<>();
    hashMap.put("1", "A");
    hashMap.put("3", "A");
    hashMap.put("2", "A");
    hashMap.put("4", "A");
    hashMap.put("3", "A");
    System.out.println(hashMap); // {1=A, 2=A, 3=A, 4=A}
}

3.5 LinkedHashMap

LinkedHashMap 继承HashMap,是对HashMap的一层封装。LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序

public static void main(String[] args) {
    LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
    linkedHashMap.put("4", "A");
    linkedHashMap.put("1", "A");
    linkedHashMap.put("3", "A");
    linkedHashMap.put("2", "A");
    linkedHashMap.put("3", "A");
    System.out.println(linkedHashMap); // {4=A, 1=A, 3=A, 2=A}
}

3.6 TreeMap

TreeMap的存储结构是红黑树,红黑树的节点之间是具备可比较性的,因此红黑树是有序的,他的元素输出顺序默认为从小到大,也可以自定义排序规则。

public static void main(String[] args) {
    TreeMap<String, String> treeMap = new TreeMap<>(Comparator.reverseOrder());
    treeMap.put("4", "A");
    treeMap.put("1", "A");
    treeMap.put("3", "A");
    treeMap.put("2", "A");
    treeMap.put("3", "A");
    System.out.println(treeMap); // {4=A, 3=A, 2=A, 1=A}
}

3.7 Hashtable

HashTable内部由数组+链表实现。数组的下标同样由key的hash获取,和HashMap类似。

因此Hashtable不支持自定义排序,并且输出顺序由 key 的hash值决定,所以输出元素的顺序和输入元素顺序无关,因此Hashtable不是有序的。

public static void main(String[] args) {
    Hashtable<String, String> hashtable = new Hashtable<>();
    hashtable.put("4", "A");
    hashtable.put("1", "A");
    hashtable.put("3", "A");
    hashtable.put("2", "A");
    hashtable.put("3", "A");
    System.out.println(hashtable); // {4=A, 3=A, 2=A, 1=A}
}

3.8 HashSet

HashSet的底层其实就是HashMap,它在内部维护了一个HashMap,key为HashMap的key,value为一个PERSENT(一个object对象)。

因此HashSet继承了HashMap的特性,值不能重复,不支持自定义排序,元素的输出顺序仅和hash有关,是个无序的集合。

public static void main(String[] args) {
    HashSet<Integer> hashSet = new HashSet<>();
    hashSet.add(5);
    hashSet.add(3);
    hashSet.add(4);
    hashSet.add(2);
    hashSet.add(5);
    System.out.println(hashSet); // [2, 3, 4, 5]
}

3.9 LinkedHashSet

继承HashSet,底层也有HashMap实现,不同于HashSet, LinkedHashSet内部有一个Entry,用于维护元素的输出顺序。LinkedHashSet值不能重复,元素输出顺序和输入顺序一致,不支持自定义的比较器,是个有序的集合。

public static void main(String[] args) {
    LinkedHashSet<Integer> linkedHashSet = new LinkedHashSet<>();
    linkedHashSet.add(5);
    linkedHashSet.add(3);
    linkedHashSet.add(4);
    linkedHashSet.add(2);
    linkedHashSet.add(5);
    System.out.println(linkedHashSet); // [5, 3, 4, 2]
}

3.10 TreeSet

TreeSet内部维护了一个TreeMap,key为TreeMap的key,value是一个PERSENT的object对象,因此TreeSet特性与TreeMap相当,可以自定义比较器,元素输出的顺序默认从小到大输出,是一个有序集合。

public static void main(String[] args) {
    TreeSet<Integer> treeSet = new TreeSet<>((m,n)->n-m);
    treeSet.add(5);
    treeSet.add(3);
    treeSet.add(4);
    treeSet.add(2);
    treeSet.add(5);
    System.out.println(treeSet); // [5, 4, 3, 2]
}

 

SAPGUI excel 导出时遇到的运行时错误:STRING_SIZE_TOO_LARGE 当报表导出需求远超单一 XLSX 文件的物理承载力时,与其在 SAPGUI 中硬拼 2 GB 限制,不如把分页、过滤、流式写入作为设计前提。掌握 ABAP2XLSX 或 CSV + Power Query 等工具链,既能满足审计合规,又能让应用服务器远离的噩梦。祝你在下一次导出海量数据时,既高效又优雅。 阅读详情

相关推荐

从特斯拉到蔚来:拆解主流智能汽车的车联网架构,看它们如何实现‘车、路、云’协同

本文深度解析了特斯拉、蔚来等主流智能汽车的车联网架构,详细拆解了其‘车、路、云’协同的技术实现。从车内网络、车际通信到云端协同,分析了通信技术、系统架构等关键技术选择,揭示了不同厂商如何通过差异化布局构建竞争优势。

weixin_42525289的博客 580

Java笔记 - 集合

由于集合类问题在面试中会经常被问到,且因其构架多、实现类复杂而显得格外重要,所以借此机会整理了一下常用集合类中的一些知识点。 1. HashMap HashMap 是线程不安全的,HashMap 是一个接口,是 Map 的一个子接口,是将键映射到值得对象,不允许键值重复,允许空键和空值;由于非线程安全,HashMap 的效率要较 HashTable 的效率高一些. 2. HashTable Has...

ECNU第一菜鸡的博客 233

从零实现Unitree Go2的SLAM建图与导航:手把手集成slam_toolbox和nav2(附Rviz2可视化配置)

本文详细指导如何在Unitree Go2四足机器人上集成slam_toolbox和nav2,实现SLAM建图与导航功能。从ROS2环境配置、雷达数据处理到slam_toolbox参数优化,再到nav2路径规划与Rviz2可视化调试,提供完整解决方案。特别适合机器人开发者快速掌握ROS2导航栈在Unitree Go2上的应用实践。

weixin_33737134的博客 1235

TreeMap倒序排序

@Test public void testMap() { // Comparator.reverseOrder()倒序排序 Map<BigDecimal, String> infoMap = new TreeMap<>(Comparator.reverseOrder()); infoMap.put(new Big...

大白能的博客 8577

KUKA机器人编程实战:5分钟搞定组输入与组输出的信号配置(附代码示例)

本文详细介绍了KUKA机器人编程中组输入与组输出的信号配置方法,通过5分钟快速掌握核心技巧。文章包含信号声明语法、典型配置流程及高级应用技巧,并附有代码示例,帮助工程师高效实现机器人与外部设备的通信。

efc123456的博客 852

保姆级教程:用torch.profiler给你的vLLM推理做个“全身体检”(附Perfetto可视化分析)

本文提供了一份详细的vLLM推理性能分析教程,通过torch.profiler和Perfetto工具链实现从数据采集到可视化分析的全流程。文章涵盖了环境配置、性能数据采集、trace文件解析以及Perfetto可视化分析,帮助开发者优化大模型推理服务的性能,显著降低计算资源消耗。

weixin_29041767的博客 359

TreeMap各种排序方式

https://www.jb51.net/article/90537.htmMap是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。•TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。•HashMap的值是没有顺序的,它是按照key的HashCode来实现的,对于这个无序的H

yygr的博客 4078

离散数学期末考试试卷(两套)-熟悉题型

3.设集合A={a,b,c,d}上有自反关系R={,,,,},对称关系S={,,,}。6.设集合A={1,2,3},B={u,v,w},C={a,b,c},f是集合A到集合B上的映射,g是集合B到集合C上的映射,f={, , },g={},则复合函数g。5. 设集合A={a,b,c,d,e},下列选项中哪一个集合不是A的划分( )。

muse3159546973的博客 6959

Java8集合之TreeMap

//Rotate Left private void rotateLeft(Entry<K,V> p) { if (p != null) { // 记录下p节点的右孩子r,用r的左孩子代替原来的右孩子 Entry<K,V> r = p.right; p.right = r.left; // 新的左孩子与p建立父子关系 if (r.left != null) r.left..

CRUD工程师 1535

ESP32-S3驱动OV3660摄像头原理图设计,已量产

本文重点拆四条主线:多来源输入电源如何收敛到 3V3,摄像头三路供电如何拆分,ESP32-S3 如何接住 DVP 数据流与外部存储,以及音频/补光/传感外围怎样挂到主控边上。至于最终图像帧率、算法策略和软件时序,当前原理图未体现。

不脱发的程序猿 985

北斗导航:提高RTK定位精度的GIS应用

其中,RTK(Real-Time Kinematic)定位技术是一种实时差分定位技术,通过利用基准站的观测数据来对移动站的测量值进行差分处理,以提高定位精度。差分处理的关键是基准站的观测数据,基准站通过全球定位系统(如北斗导航系统)获取卫星信号并记录观测数据。通过使用RTK定位技术,结合北斗导航系统的观测数据和差分处理,可以实现高精度的定位结果。我们将介绍RTK定位的原理、使用北斗导航系统进行RTK定位的步骤,以及如何将定位结果与GIS数据进行集成和可视化展示。步骤1:设置基准站和移动站。

OvzStream的博客 476

Java-数据结构(二)-Map:HashMap、TreeMap、LinkedHashMap

Map是Java中的一个接口,它代表了一种键值对的映射关系。它允许我们通过Key来访问Value。在Map中,每个Key都是唯一的,而且与该Key对应的Value是一一对应的关系。维度HashMapTreeMap底层实现哈希表红黑树哈希表+链表插入顺序无序无序(基于键的自然排序或自定义排序)保持插入顺序查找效率O(1)O(log n)O(1)迭代顺序无序有序(基于键的自然排序或自定义排序)保持插入顺序或访问顺序键的唯一性允许null键和null值。

向诸位大佬虚心学习 8449

【大语言模型 85】IA3与其他PEFT方法对比

在大语言模型时代,参数高效微调(PEFT)技术成为了降低微调成本的关键。本文深入解析IA3(Infused Adapter by Inhibiting and Amplifying Inner Activations)方法,并与LoRA、AdaLoRA、Prefix Tuning等主流PEFT技术进行全面对比,通过理论分析、代码实现和实验验证,帮助读者理解不同PEFT方法的优劣势和适用场景,为实际项目中的技术选型提供科学依据。

熵数实验室 755

Java Set集合详解及Set与List的区别

Java中的Set集合是继承Collection的接口,是一个不包含重复元素的集合。     下图是Set集合的源码。 Set和List都是以接口都形式来进行声明。Set主要包含三种存放数据类型都变量,分别是HashSet,LinkedHashSet,TreeSet. HashSet LinkedHashSet TreeSet的主要使用情境         HashSet,从名称就可以看...

wei_feng1的博客 489

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JAVA集合概述(一)

集合的基础知识 集合的分类

u012684144的博客 158

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java中的集合和实现类

1.集合概述1.1什么是集合?有什么用?数组其实就是一个集合。集合实际上就是一个容器,可以来容纳其他类型的数据。集合为什么说在开发中使用较多?集合是一个容器,是一个载体,可以一次容纳多个对象。在实际开发中,假设连接数据库,数据库当中有10条纪录,那么假设把这19条记录查询出来,在java程序中会将10条数据封装成10个java对象,然后将10个java对象放到某一个集合当中,将集合传到前端,然后遍历集合,将一个数据一个数据展现出来。

m0_74249744的博客 531

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java中TreeSet保证元素唯一且有序的原因

TreeSet底层数据结构 TreeSet底层依赖于TreeMap,TreeMap的数据结构是二叉树(红黑树),由底层数据结构决定了TreeSet中元素有序且唯一。 TreeSet集合中数据存储 使用二叉树存储数据 //第一次存储数据没有树根,就创建一个树根,把这个元素赋值给树根; //第二次进行存储的时候,首先和根节点的元素进行比较,比较有三种情况: //第一种情况当前元素和根节点的元素相同...

MAX_YanBangbang的博客 1984

Java中哪些集合是有序的?

Java中哪些集合是有序的? 实现了 List 接口的集合类全部有序:比如ArrayList、LinkedList LinkedHashMap:在 HashMap 的基础上多维护了一个双向链表。 ConcurrentSkipListMap:基于跳表实现,跳表内所有的元素都是排序的。 TreeMap: TreeSet: ...

dl674756321的博客 1万+

Java--Set集合

Java–Set集合 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 介绍 不包含重复元素的集合 Set集合的数据库不能重复(== 或 eqauls)的元素 继承了Collection接口 特点 无序,不可重复,没有索引 Set的实现类 HashSet 此类实现Set接口,由哈希表(实际为HashMap实例)支持。 对集合...

归子莫的博客 293

Java中的集合框架有哪些主要组件?它们之间有何区别?

综上所述,Java集合框架是一个强大而灵活的工具,它提供了丰富的组件和接口,使得我们可以方便地存储、操作和管理数据。同时,迭代器、泛型、并发集合和集合工具类等特性也进一步增强了集合框架的功能和灵活性。Java集合框架从Java 5开始支持泛型,这使得我们可以在声明集合时指定集合中元素的类型。通过实现集合框架中的接口(如List、Set、Map等),我们可以创建具有特定行为和数据结构的集合类。Java中的集合框架是一组类和接口的集合,用于存储和操作数据。Java集合框架还提供了一些支持并发操作的集合类,如。

编程小弟的博客 1122

Day1-TreeMap集合怎样保证有序性

TreeMap集合怎样保证有序性 首先看一下TreeMap集合的使用,TreeMap集合也是键值对的,我们添加下面四个元素 package com.tset.one; import java.util.TreeMap; /** * @author :caizhengjie * @description:TODO * @date :2021/7/21 10:48 下午 */ public class TestTreeMap { public static void main(String[

蔡政洁的博客 1195

黑马程序员_java入门_Set集合

------- android培训、java培训、期待与您交流! ----------   一.set集合特点 1.存储无序,不可重复,取出可能无序   二set集合分类 -----------------HashSet 底层数据结构哈希表,按哈希值存 -----------------TreeSet 底层机构二叉树,按树顺序存   同样都用迭代器取出   三HashSet

ztr999的专栏 488

Java集合:Set

Set集合,我们常见的Set有HashSet,TreeSet,LinkedHashSet,我们先来看下HashSet。 一、HashSet 成员变量: 成员变量只有可怜的两个,一个是装数据的容器,一个类似于标记 private transient HashMap<E,Object> map; private static final Object PRESENT = new Object(); 数据操作方法: 我们从添加/移除方法可以看出HashMap是以(Key,value

记录,记录,记录 156

Set 总结

目录 HashSet 总结: 彩蛋 LinkedHashSet 总结 彩蛋 TreeSet 总结 彩蛋 问题 java里面的Set对应于数学概念上的集合,里面的元素是不可重复的,通常使用Map或者List来实现。 HashSet 参考博客: 【死磕 Java 集合】— HashSet源码分析 HashSet是Set的一种实现方式,底层主要使用Hash...

小白鼠丶 205

Java集合之List

Java集合之List

hai_man_的博客 509

Java集合之HashSet、LinkedHashSet、TreeSet

讨论集合关注的问题: 底层数据结构 增删改查方式 初始容量,扩容方式,扩容时机 线程安全与否 是否允许空,是否允许重复,是否有序 1. 概述 前篇,我写了关于Map系列的集合(点击跳转);本篇重新回顾Collection三大类Set、List、Queue中的Set。 Set可以视作是数学中集合的概念,也即集合中不能有重复的元素。Set集合中的各种实现集合,其内部都与Map有关,先对Map...

fanleehao的博客 4465
上一篇: count(1)、count(*)与count(列名)的执行区别
下一篇: Spring Boot 启动扩展点总结
Yuwen_forJava
博客等级 码龄9年 28粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值