java集合解析-Collection 类型

Java 集合概览

Java 集合, 也叫作容器,主要是由两大接口派生而来:

一个是 Collection接口,主要用于存放单一元素;

另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。没有stack接口,因为stack被jdk1.6引入的Deque取代。

Java 集合框架如下图所示:
在这里插入图片描述

List

包含以下三种类型:
ArrayList
Vector
LinkedList

ArrayList

ArrayList:Object[] 数组。
在这里插入图片描述
容量capacity: 表示数组能容纳的元素个数。这里注意: new一个默认arraylist,初始化的容量是0,只有当第一次插入元素之后,容量会变为DEFAUT_CAPACITY = 10;

扩容: 当插入新元素时,会先校验数组大小是否能容纳所有元素,如果不满足时需要扩容。扩容会创建一个新的数组,将现有数组数据拷贝到新数组;

扩容大小:每次数组容量的增长大约是其原容量的1.5倍。这种操作的代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。

底层采用Object[]数组存储数据,能容纳任何类型的对象。线程不安全

ArrayList支持存储NULL数据

Vector

Vector:Object[] 数组。
底层使用Object[] 存储,线程安全。

LinkedList

LinkedList:双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)。
在这里插入图片描述
头尾指针 : 链表维护了两个指针,分别指向LinkedList的头和尾当链表元素为0时,这两支针指向null。因为可以快速找到头尾元素,所以LinkedList也可以用作栈、队列和双向队列;

节点:列表中所有元素包装成Node节点存入,因为是双向链表,所以Node节点分别有一个向前和向后的支针。头节点的向前指针和尾节点的向后指针都指向null。
性能: 下标相关的操作都是线性时间,而在首段或者末尾删除元素只需要常数时间。
插入和删除: 因为链表和数组的特性差异,LinkedList的插入和删除操作不会导致前后的元素挪动,而只需指针的变换。
线程不安全:
如果需要多个线程并发访问,可以先采用collections.synchronizedList()方法对其进行包装
ArrayDeque 支持存储NULL数据

HashSet、LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同。HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。

Set

包含以下三种类型:
HashSet
LinkedHashSet
TreeSet

HashSet

HashSet 的底层数据结构是哈希表(基于 HashMap 实现)
所有元素的的Value值统一为PRESENT;只用Map的key作为Set的集合。

LinkedHashSet

底层通过LinkedHashMap来保存所有元素。
继承HashSet,操作上与父类相同,直接调用父类方法即可。

TreeSet

基于红黑树实现
使用二叉树原理,对元素进行排序。插入元素时需要调整树的结构,将元素放到指定位置。支持自然顺序访问,但是添加、删除、包含等操作要相对低效(log(n)时间)。
因为需要排序,所以必须具备比较大小的能力。基础包装类Integer,String等可以默认支持排序。如果自定义类,则需要实现Comparable接口,定义出两个自定义类的对象如何比较大小。

Queue

PriorityQueue

Object[] 数组来实现小顶堆

  • . PriorityQueue利用了二叉堆的数据结构来实现的,底层使用可变长的数组来存储数据
  • . PriorityQueue通过堆元素的上浮和下沉,实现了在O(logn)的时间复杂度内插入元素和删除堆顶元素。
  • . PriorityQueue是非线程安全的,且不支持存储NULL和non-comparable的对象。
  • . PriorityQueue默认是小顶堆,但可以接收一个Comparator 作为构造参数,从而来自定义元素优先级的先后。

DelayQueue

底层是一个基于 PriorityQueue 实现的一个无界队列,是线程安全的。
默认情况下, DelayQueue 会按照到期时间升序编排任务。只有当元素过期时(getDelay()方法返回值小于等于 0),才能从队列中取出。

为了保证线程安全还用到了可重入锁 ReentrantLock,确保单位时间内只有一个线程可以操作延迟队列。

最后,为了实现多线程之间等待和唤醒的交互效率,DelayQueue 还用到了 Condition,通过 Condition 的 await 和 signal 方法完成多线程之间的等待唤醒。

ArrayDeque:

可扩容动态双向数组。
. ArrayDeque是基于可变长的数组和双指针来实现,
. ArrayDeque 不支持存储NULL 数据
.ArrayDeque是在JDK1.6才被引入的
. ArrayDeque插入时可能存在扩容过程,不过均摊后的插入操作依然为
o(1)
从性能的角度上,选用ArrayDeque来实现队列要比LinkedList 更好。此外,ArrayDeque 也可以用于实现栈。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

骨传导什么牌子好?六大专业选购的黄金规则与避坑指导

谈论到运动时佩戴的耳机,骨传导耳机必须是话题中的热点。与传统耳机或入耳式耳机不同,骨传导耳机解放了你的耳道,让你在挥洒汗水的同时,也能享受音乐的魅力。更重要的是,它不会阻碍你听到周围的声音,这对于…

盘点自动化汽车生产线设备 数据采集分析联合各设备

1.机器人自动装配线 机器人自动装配线已成为汽车制造业中的常见场景。这些机器人在汽车组装的各个环节发挥关键作用,从焊接和铆接到零部件组装。它们不仅提高了装配速度,还确保了产品的一致性,降低了废品率。 2.3D打印技术 3D打印技术正在汽车…

医院信息系统(HIS):一文扫盲,算是所有信息系统里面复杂的

大家好,我是贝格前端工场,本期继续分享常见的B端管理系统,欢迎大家关注,如有B端写系统界面的设计和前端需求,可以联络我们。 一、什么是HIS系统 HIS系统(Hospital Information System)是医院信…

【操作系统】磁盘存储空间的管理

实验5 磁盘存储空间的管理 一、实验目的 磁盘是用户存放程序和数据的存储设备,磁盘管理的主要目的是充分有效地利用磁盘空间。本实验模拟实现磁盘空间的分配与回收,使学生对磁盘空间的管理有一个较深入的理解。 二、实验内容 实验任务:用位…

Canal + Kafka 同步 MySQL 数据到 Redis

解决缓存和数据库一致性问题 一般来说,缓存中的数据没什么问题,但是数据库更新后,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。由于写和读是并发的,没法保证顺序&…

运营抖店为什么不能多选类目?什么类目适合新手来玩?

大家好,我是电商小布。 想要入驻抖音小店,必备的资质材料就是营业执照。 而执照上的范围,就是我们开店所能选择的经营类目。 有的小伙伴在开店的时候,并没有想明白自己是想要做什么,小店未来的发展方向是什么。 结…

Docker基础篇(四) 容器数据卷 容器间传递共享(--volumes-from)

容器间传递共享 当前没有运行的容器 两个数据卷: containVolum-01 containVolum-02 docker run -it --name zenA zen/centos 上面生成了容器 zenA ctrl P Q docker run -it --name zenB1 --volumes-from zenA zen/centos ctrl P Q docker run -it --name zen…

全球游戏市场回暖,Flat Ads推动海外获客增长

摘要:热门游戏品类分析,解读新兴市场与赛道 近日,中国音数协游戏工委发布了《2023年中国游戏出海研究报告》,据报告数据显示,2023年,全球游戏市场规模11773.79亿元,同比增长6.00%,呈现增长回暖趋势。 图源:伽马数据 1.SLG和RPG游戏热度居高不下,休闲游戏增长势头强劲 目前,S…

java 时间格式 YYYY 于yyyy的区别

java formatDate 时间时,经常需要输入格式比如 YYYYMMDD,yyyyMMdd 这两个是有区别的 具体每个参数可以看下面

左手“兑抵接”,右手债务逾期,华夏幸福离“上岸”还有多远?

撰稿|行星 来源|贝多财经 进入2024年,华夏幸福仍不太“幸福”。 近日,华夏幸福基业股份有限公司(SH: 600340,下称“华夏幸福”)发布了关于债务逾期、债务重组进展等事项的公告。内容显示,华夏幸福截至1月…

MybatisPlus--03--IService、ServiceImpl

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. IService接口1.1 IService、ServiceImpl 接口的使用第一步:实现basemapper接口第二步:编写service类第三步:编写serviceImpl第…

白令海峡的题解

原题描述: 时间限制: 1000ms 空间限制: 524288kB 题目描述 很久很久以前,一座大陆桥横跨西伯利亚东端与美洲大陆西端。 处于进化早期的人类,正以部落的形式在大陆上游荡、捕猎,四海为家。在饥饿与寒冷折磨下,人…

开源软件:塑造软件行业未来的协作与创新之力

随着信息技术的迅猛发展,开源软件已经逐渐成为软件开发的潮流,以其独特的低成本、可协作性和透明度等特性,在全球范围内引起了广泛的关注和应用。越来越多的企业和个人选择使用开源软件,这不仅推动了软件行业的繁荣,还…

电路设计(27)——交通信号灯的multisim仿真

1.功能要求 使用数字芯片设计一款交通信号灯,使得: 主干道的绿灯时间为60S,红灯时间为45S 次干道的红灯时间为60S,绿灯时间为45S 主、次干道,绿灯的最后5S内,黄灯闪烁 使用数码管显示各自的倒计时时间。 按…

: ) 万字项目实践指南——贪吃蛇 手把手教你写出自己的小游戏!

目录 前言 1. 游戏背景 2. 游戏效果演示 3. 目标 4. 项目定位 5. 技术要点 6. Win 32 API 介绍 6.1 Win32 API 6.2 控制台程序(Console) 6.3 控制台屏幕上的坐标COORD​ 6.4 GetStdHandle 6.5 GetConsoleCursorInfo 6.5.1 CONSOLE_CURSOR_INFO ​ 6.6 SetConsoleCur…

Yooasset、UniTask 使用遇到的一个奇怪的问题

先上截图 从截图可以看出 释放资源的方法是一个同步方法,但是执行释放资源的时候,竟然触发了我另一个地方的代码。 经检查,这个地方之所以会被执行,是因为Yooasset在释放资源的时候,激活了加载资源的等待。

迅为RK3568开发板驱动开发指南-输入子系统

《iTOP-RK3568开发板驱动开发指南》更新,本次更新内容对应的是驱动(第十三篇 输入子系统)视频,帮助用户快速入门,大大提升研发速度。 第13篇-输入子系统目录 第1篇 驱动基础篇 第2篇 字符设备基础 第3篇 并发与竞争 …

如何用jmeter请求application/octet-stream,image/jpeg

用postman调用时: 用jmeter: 注意上图不要勾选,不然会把所有的内容都以二进制传进去,我们不勾选只传二进制的图片内容,勾选了会把MIME类型、参数名称都转为二进制传进去。会报错。

网络知识

目录 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 网关 路由 DNS(Domain Name Server) —— 域名服务器 IP地址(Internet protocol address) —— 互联网协议地址 子网掩码 作用:划分网段 网络部分相同的IP地址&a…