【Java-Java集合】Java集合详解与区别

news2024/12/23 16:19:55

【Java-Java集合】Java集合详解与区别

  • 1)概述
  • 2)集合框架图
    • 2.1.总框架图
    • 2.2.Iterable 框架图
    • 2.3.Map 框架图
  • 3)List
    • 3.1.ArrayList 类继承图
    • 3.2.LinkedList 类继承图
  • 4)Set
    • 4.1.HashSet 类继承图
    • 4.2.LinkedHashSet 类继承图
    • 4.3.TreeSet 类继承图
  • 5)Map
    • 5.1.HashMap 类继承图
    • 5.2.TreeMap 类继承图
    • 5.3.HashTable 类继承图
  • 6)集合对比

1)概述

1、所有的集合类和集合接口都在 java.util 包下。

2、在内存中申请一块空间用来存储数据,在Java中集合就是替换掉定长的数组的一种引用数据类型。

3、集合类型主要有3种:Set(集)、List(列表)和 Map(映射)。当然还有一些底层的集合如:Vector,Stack,Queue等,但是在日常使用中用的并不多,这里我们只介绍开发中常用的集合。

4、集合接口分为:Collection 和 Map(List、Set 实现了Collection接口)

2)集合框架图

2.1.总框架图

在这里插入图片描述

2.2.Iterable 框架图

在这里插入图片描述

2.3.Map 框架图

在这里插入图片描述

3)List

1、可以重复,有序,通过索引取出加入数据,顺序与插入顺序一致,可以含有 null 元素。

2、List 集合分为两类,ArrayList、LinkedList,还有 Vector(不常用)。

  • ArrayList底层数据结构使数组结构 array,查询速度快,增删改慢,因为是一种类似数组的形式进行存储,因此它的随机访问速度极快,线程不安全

  • LinkedList底层使用链表结构,增删速度快,查询稍慢。LinkedList的每个元素是互相连接的,一旦查询数据,每次都要重头开始查询,费时间,但是增删改查就可以准确的找到对应的位置了,线程不安全

  • Vector底层是数组结构array,与ArrayList相同,查询速度快,增删改慢,线程安全

3、ArrayList 与 Vector 的区别:

  • 如果集合中的元素数量大于当前集合数组的长度时,Vector的增长率是目前数组长度的100%,而ArryaList增长率为目前数组长度的50%。所以,如果集合中使用数据量比较大的数据,用Vector有一定优势。

  • 线程同步ArrayList是线程不同步,所以Vector线程安全,但是因为每个方法都加上了synchronized,所以在效率上小于ArrayList。

4、集合的常用遍历方式:

  • 普通for循环

  • 增强for循环

  • 迭代器遍历

3.1.ArrayList 类继承图

在这里插入图片描述

3.2.LinkedList 类继承图

在这里插入图片描述

4)Set

1、数据不可以重复(唯一),无序,实现类都不是线程安全的类,解决方案:Set set = Collections.sysnchronizedSet(Set对象)

2、Set 集合大致分为两类:HashSet、LinkedHashSet、TreeSet

  • HashSet

    是 Set 接口(Set 接口是继承了 Collection 接口的)最常用的实现类,顾名思义,底层是用了哈希表(散列/hash)算法。其底层其实也是一个数组,存在的意义是提供查询速度,插入的速度也是比较快,但是适用于少量数据的插入操作,线程不安全

  • LinkedHashSet

    继承了 HashSet 类,所以它的底层用的也是哈希表的数据结构,但因为保持数据的先后添加顺序,所以又加了链表结构,但因为多加了一种数据结构,所以效率较低,不建议使用,如果要求一个集合急要保证元素不重复,也需要记录元素的先后添加顺序,才选择使用 LinkedHashSet,线程不安全

  • TreeSet

    Set 接口的实现类,也拥有 Set 接口的一般特性,但是不同的是他也实现了 SortSet 接口,它底层采用的是红黑树算法(红黑树就是满足一下红黑性质的二叉搜索树),要注意的是在 TreeSet 集合中只能存储相同类型对象的引用,线程不安全

3、Tree最重要的就是它的两种排序方式:自然排序、客户端排序

  • 自然排序:实现了 Comparable 接口,所以 TreeSet 可以调用对象的 ComparableTo() 方法来比较集合的大小,然后进行升序排序,这种排序方式叫做自然排序。其中实现了 Comparable 接口的还有 BigDecimal、BigInteger、Byte、Double、Float、Integer、Long、Short(按照数字大小排序)、Character(按照 Unicode 值的数字大小进行排序)String(按照字符串中字符的Unicode值进行排序)类等。

  • 客户化排序:其实就是实现 java.util.Comparator 接口提供的具体的排序方式, 是具体要比较对象的类型,他有个 compare 的方法,如 compare(x,y) 返回值大于 0 表示 x 大于 y,以此类推,当我们希望按照自己的想法排序的时候可以重写 compare 方法。

4、集合的常用遍历方式:

  • 普通for循环

  • 增强for循环

  • 迭代器遍历

4.1.HashSet 类继承图

在这里插入图片描述

4.2.LinkedHashSet 类继承图

在这里插入图片描述

4.3.TreeSet 类继承图

在这里插入图片描述

5)Map

1、Map 是一种把键对象和值对象进行映射的集合,其中每一个元素都包含了键对象和值对象,其中值对象也可以是 Map 类型的数据,因此,Map 支持多级映射,Map 中的键是唯一的,但值可以不唯一

2、Map 大致分为三类:HashMap、TreeMap、HashTable (不常用)

  • HashMap(无序)

    它和 HashSet 都是利用哈希表来完成的,区别其实就是在哈希表的每个桶中,HashSet 只有 key,而 HashMap 在每个 key 上挂了一个 value,线程不安全

  • TreeMap(有序)

    它实现了 SortMap 接口,也就是使用了红黑树的数据结构,和 TreeSet 一样也能实现自然排序和客户化排序两种排序方式,而哈希表不提供排序,线程不安全

  • HashTable

    Hashtable 继承 Map 接口,实现一个 key-value 映射的哈希表。任何非空(non-null)的对象都可作为 key 或者 value,线程安全

3、集合的常用遍历方式:

  • KeySet()是将 Map 中所有的 Key 放在一起,然后通过 get(key),获取对应的 Value。

  • EntrySet()将 Key-Value 当做一个整体放到一个 Set 中,通过 getKey() 和 getValue() 的方法获取对应的 Key 和 Value。

5.1.HashMap 类继承图

在这里插入图片描述

5.2.TreeMap 类继承图

在这里插入图片描述

5.3.HashTable 类继承图

在这里插入图片描述

6)集合对比

在这里插入图片描述

详细https://blog.csdn.net/u010775025/article/details/79315361

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

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

相关文章

C/C++开发中使用pkg-config来引用依赖库

在使用C/C进行开发的过程中,经常需要引用其它的库,可能是系统已经安装好的,也可能是其它的外部库。 如果是系统支持的库,可能在不同的系统下,其路径也不相同,在项目开发的时候跨平台将会是一个问题。比如&…

从零开始云服务器网卡抓包

从零开始云服务器网卡抓包 一. 服务器上新增自己的用户二. 添加组件libpcap四. 安装测试环境六. 编写demo代码七. 正式项目代码编译八. 结果展示 一. 服务器上新增自己的用户 我这边是ubuntu服务器,其默认username为ubuntu,使用创建服务器时候的密码通过…

10.基于共享储能电站的工业用户日前优化经济调度(论文复现)

matlab代码:基于共享储能电站的工业用户日前优化经济调度 相关程序代码资源:风、光、负荷场景生成;风电出力各场景及概率;光伏出力各场景及概率;负荷各场景及概率;场景的削减;样本概率初始化&a…

【云原生进阶之容器】第六章容器网络6.5.1--Calico网络方案综述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

Spring Web容器响应异常排查_Poller线程异常退出

问题一_系统响应异常 问题现象 04-11 18点左右客户反馈系统很慢;18点多,反馈pda登录异常; 19:20左右,本地网页登录,某些请求超时;某些正常; 短时间定位后无头绪,保留了stack和dum…

球友的一个帖子,半夜三点给我整睡不着了……

文章目录 一、起因二、建议1、括号和缩进2、仔细审题3、独立思考4、早起的好办法5、chatgpt会代替人类吗? 三、解决1、数据结构2、初始化3、判定 一、起因 事情的起因源自于星球里面一位球友的帖子,本来三点醒来上完厕所打算继续睡,突然手机响…

无人机应急救援有保障吗?如何实现救援?

无人机应急救援有保障吗?如何实现救援?中国自然灾害种类较多,分布地域广,发生频率较高。当遭遇洪水、火灾、洪水、地震、暴雪等灾害事故时,常规的信息通信基础设施受到损伤,导致信号中断。如果灾害事故地点相对偏僻,…

淄博旅游“一夜爆火”,五一流量大盘已经开启

全民调休换来的五一小长假即将来临,经过几年“禁锢”后,这两年的旅游业开始回暖。 而今年国内旅游黑马竟指向了新人淄博。 山东淄博烧烤一直以来都“小有名气”,但是这只在周边城市,或者部分人群里传播,而在今年&…

来使用分支语句和循环语句实现一个小游戏吧(猜数字游戏)

猜数字游戏 1.代码展示2.菜单设计3.主函数部分3.随机数设计 1.代码展示 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h>void menu() {printf("************************\n");printf("*** 1.p…

移动端导航设计

根据产品层级的深度和广度&#xff0c;选择适合的导航模式&#xff0c;是产品设计中的关键一环。 任何APP的组织信息都需要以某种导航框架固定起来&#xff0c;一个新的产品合适的导航框架&#xff0c;决定了产品之后的延伸和扩展。 移动端的屏幕尺寸就这么大&#xff0c;操作方…

java定位系统源码,通过独特的射频处理,配合先进的位置算法,可以有效计算出复杂环境下的人员与物品的活动信息

智慧工厂人员定位系统源码&#xff0c;区域电子围栏管控源码 文末获取联系&#xff01; 在工厂日常生产活动中&#xff0c;企业很难精准地掌握访客和承包商等各类人员的实际位置&#xff0c;且无法实时监控巡检人员的巡检路线&#xff0c;当厂区发生灾情或其他异常状况时&#…

Layer组件多个iframe弹出层打开与关闭及参数传递

Layer官网地址&#xff1a;http://layer.layui.com/ 1、多个iframe弹出层&#xff08;非嵌套&#xff09; 1.打开iframe弹出层js代码 &#xff08;1&#xff09;示例一&#xff1a; content参数可传入要打开的页面&#xff0c;type参数传2&#xff0c;即可打开iframe类型的弹层…

STM32入门指南:了解STM32

1. 初识 STM32 STM32&#xff0c;从字面上来理解&#xff0c;ST 是意法半导体&#xff0c;M 是 Microelectronics 的缩写&#xff0c;32 表示 32 位&#xff0c;合起来理解&#xff0c;STM32 就是指 ST 公司开发的 32 位微控制器。在如今的 32 位控制器当中&#xff0c;STM32 …

GitHub新建仓库 上传文档

Author:龙箬 Computer Application Technology Change the World with Data and Artificial Intelligence ! CSDNweixin_43975035 振&#xff0c;而飞破虚空 点击New repository 自定义仓库名称&#xff0c;并勾选 “Add a README file” 选项 复制Code链接 打开终端Git git cl…

夏驰和徐策带你从零开始学数据结构——哈希表

哈希表的概念&#xff1a; 哈希表是一种常用的数据结构&#xff0c;它可以在 O(1) 的时间复杂度内执行插入、查找和删除操作。哈希表的核心思想是使用哈希函数将键值对映射到数组中的一个位置上&#xff0c;从而实现快速的访问和修改。 哈希表由两个主要部分组成&#xff1a;…

Android开发—入门Kotlin编程语言

一、Kotlin简介 为什么Kotlin能代替Java此为Android官方第一支持的开发语言&#xff1f; 1&#xff09;Kotlin的语法更加简洁&#xff0c;对于同样的功能&#xff0c;使用Ktolin开发的代码量可能会比使用Java开发减少50%甚至更多&#xff1b; 2&#xff09;Kotlin语法更加高…

【Linux】文件IO---应用开发角度

目录简述 目录 前言&#xff1a; 一、Linux的文件 二、Linux文件系统目录结构 三、文件访问的方式 &#xff08;1&#xff09;通用方式&#xff1a;open/read/write/lseek/close 示例&#xff1a; &#xff08;2&#xff09;非通用函数&#xff1a;ioctl/mmap 示例&am…

使用ChatGPT+MindShow一键生成PPT,以后再也不用担心制作PPT啦

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

深度学习及使用全连接神经网络实现手写数字识别案例开发

1.什么是深度学习和机器学习有什么区别&#xff1f;是什么原因使得部分问题机器学习无法解决需要深入研究深度学习&#xff1f; 人工智能、机器学习、深度学习的区别是什么&#xff1f;_哔哩哔哩_bilibili 深度学习是一种机器学习方法&#xff0c;它通过构建多层神经网络来实…

tmall.product.template.get( 产品接口 )

&#xffe5;免费必须用户授权 产品模板获取接口&#xff0c;对于非关键属性的类目&#xff0c;发布达尔文(监管)产品时&#xff0c;必须先根据类目获取产品模板。 产品模板定义产品发布需要的类目属性&#xff0c;包括&#xff1a; 关键属性:关键属性可以在类目上不存在。不…