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://www.rhkb.cn/news/262041.html

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

相关文章

二.西瓜书——线性模型、决策树

第三章 线性模型 1.线性回归 “线性回归”(linear regression)试图学得一个线性模型以尽可能准确地预测实值输出标记. 2.对数几率回归 假设我们认为示例所对应的输出标记是在指数尺度上变化,那就可将输出标记的对数作为线性模型逼近的目标,即 由此&…

Sora横空出世!AI将如何撬动未来?

近日,OpenAI 发布首个视频生成“Sora”模型,该模型通过接收文字指令,即可生成60秒的短视频。 而在2022年末,同样是OpenAI发布的AI语言模型ChatGPT,简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…

基于Java+SpringBoot+Vue前后端分离婚纱影楼管理系统设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行交流合作✌ 主要内容:SpringBoot、Vue、SSM、HLM…

Linux常见的指令

目录 01. ls 指令02. pwd命令03. cd 指令04. touch指令05.mkdir指令(重要):06.rmdir指令 && rm 指令(重要):07.man指令(重要):08.cp指令(重要&#x…

vscode突然连不上服务器了,以前都可以的,并且ssh等其它方式是可以连接到服务器的

过完年回来准备开工干活,突然发现vscode连不上服务器了,奇了怪了,年前都可以的,看了一下报错,如下, 以为是服务器挂了,结果执行ssh xxxxxx 发现是可以远程连接的,看来服务器没有问题…

【selenium】执行 Javascript 脚本 滚动、元素的特殊操作等

某些特殊情况下,使用selenium的api无法操作页面元素,点击、滚动实现的某些功能,可以考虑通过执行js来完成。 为什么不用js写自动化?——selenium第一版是js写的,但js兼容性存在问题,所以引入webdriver 现在…

【GPTs分享】每日GPTs分享之Canva

简介 Canva,旨在帮助用户通过Canva的用户友好设计平台释放用户的创造力。无论用户是想设计海报、社交媒体帖子还是商业名片,Canva都在这里协助用户将创意转化为现实。 主要功能 设计生成:根据用户的描述和创意需求,生成定制的设…

PDF转excel各种方案优劣对比、选择技巧

随着数字化时代的到来,PDF文档已经成为我们日常工作中常见的一种文件格式。然而,有时候我们需要将PDF文档中的数据导入Excel表格中进行处理和分析。手动复制粘贴不仅效率低下,还容易出错。那么,如何快速将PDF文档转换为Excel表格呢…

jquery 简介与解析

jQuery是一个快速、小巧且功能丰富的JavaScript库。它简化了诸如HTML文档遍历和操作、事件处理、动画以及Ajax操作等任务。jQuery的设计理念是“写得更少,做得更多”,这意味着通过jQuery,可以用更少的代码完成更多的工作。 主要特点&#xff…

用html编写的招聘简历

用html编写的招聘简历 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

低代码平台智能化

前言 为提升人效&#xff0c;我们组自研了一个低代码平台&#xff0c;说是自研但其实还是amis为核心的低代码平台&#xff0c;众所周知&#xff0c;低代码平台使用起来都会有一定的学习成本&#xff0c;尤其是在用户体量上来之后&#xff0c;经常会有人来问我如何使用或者让我…

Plug and Play ADS-B Transceiver TR-1W for UAV and Drones

目录 Introduction TECHNICAL PARAMETERS ELECTRICAL SPECIFICATION MECHANICAL SPECIFICATION Introduction OVERVIEW TR1W belongs to the class of the smallest ADSB transceivers on market and has been developed for civil and commercial Unmanned Aircraft Syst…

MKdocs添加顶部公告栏

效果如图&#xff1a; docs/overrides下新建main.html &#xff0c;针对main.html文件 树状结构如下: $ tree -a . ├── .github │ ├── .DS_Store │ └── workflows │ └── PublishMySite.yml ├── docs │ └── index.md │ └──overrides │…

Cesium1.95地图使用UrlTemplateImageryProvider加载supermap rest服务报错问题

Cesium1.95地图使用UrlTemplateImageryProvider加载supermap rest服务报错问题 问题描述问题分析解决方案 问题描述 参考这篇博客加载supermap的 rest服务 使用Cesium1.65时能正常加载&#xff0c;升级为1.95后&#xff0c;获取图片的请求报400 Bad Request错误 问题分析 查…

mac电脑 安装 ios开发工具xcode步骤 以及新建ios项目

在Mac电脑上安装Xcode&#xff0c;苹果公司的官方iOS开发工具&#xff0c;以及新建iOS项目&#xff0c;以下是详细步骤&#xff1a; 安装Xcode 1. 打开Mac上的App Store。 2. 在搜索栏中输入“Xcode”。 3. 从搜索结果中找到Xcode&#xff0c;点击“获取”按钮。 4. 输入您的Ap…

【鸿蒙 HarmonyOS 4.0】路由router

一、介绍 页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。 二、页面跳转 2.1、两种跳转模式&#xff1a; router.pushUrl()&…

数据结构2月19日

题目&#xff1a;顺序表作业 代码&#xff1a; 功能区&#xff1a; #include <stdio.h>#include <stdlib.h>#include "./d2191.h"SeqList* create_seqList(){SeqList* list (SeqList*)malloc(sizeof(SeqList));if(NULL list){return NULL;}list->p…

06 分频器设计

分频器简介 实现分频一般有两种方法&#xff0c;一种方法是直接使用 PLL 进行分频&#xff0c;比如在 FPGA 或者 ASIC 设计中&#xff0c;都可以直接使用 PLL 进行分频。但是这种分频有时候受限于 PLL 本身的特性&#xff0c;无法得到频率很低的时钟信号&#xff0c;比如输入 …

Puppeteer 使用实战:如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客(三)

文章目录 往期效果将文章信息导出适配 hexo 的文章模板导出的文章路径问题终端控制执行脚本代码整理结尾 往期 Puppeteer 使用实战&#xff1a;如何将自己的 CSDN 专栏文章导出并用于 Hexo 博客&#xff08;二&#xff09; 效果 写了一个 node 脚本用来批量处理 md 文件 本期…