Java基础篇——集合

2023-11-08

活动地址:CSDN21天学习挑战赛

1、为什么使用集合

        集合与数组类似,都是容器,我们为什么不用数组而还要使用集合呢?

数组的特点:

  • 数组定义完成并启动后,类型确定、长度固定
  • 不适合元素的个数和类型不确定的业务场景,更不适合做需要增删的操作。
  • 数组的功能比较单一,处理数据的能力并不是很强大。

集合的特点:

  • 集合的大小不固定,启动后可以动态变化,类型也可以选择不固定
  • 集合非常适合应用于元素的个数不确定,且需要做增删操作的场景。
  • 同时,集合提供的种类非常丰富,功能也十分强大,在开发中,集合使用的更多。

注意:

        由于集合只能存储引用数据类型的数据,所以不能存储 基本类型:boolean、byte、short 、int、long、char、float、double。

        倘若想使用集合对基本类型进行存储,可以使用基本数据类型对应的包装类。Boolean、Byte、Short、Integer、Long、String、Float、Double。

2、集合类体系结构

        集合按照单列的双列分为两种:Collection和Map

Collection单列集合,每个元素(数据)只包含一个值。

Map双列集合,每个元素包含两个值(键值对)。

3、Conllection集合体系

         Collection集合体系主要有两种:List、Set

        Conllection API:

 3.1、List

List系列集合的特点:

  •   ArrayList、LinekdList :有序,可重复,有索引
  • 有序:存储和取出的元素顺序一致
  • 有索引:可以通过索引操作元素
  • 可重复:存储的元素可以重复

 List集合特有方法:

 3.1.1、ArrayList

ArrayList底层是基于数组实现的:根据索引定位元素快,增删需要做元素的移位操作。

因为ArrayList的底层是基于数组实现的,所以它的查询快而增删元素相对较慢。

第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组。

 3.1.2、LinkedList

LinkedList的特点:

        底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。

 3.2、Set

 Set系列集合特点:

  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素。

Set集合实现类的特点:

  • HashSet : 无序、不重复、无索引。
  • LinkedHashSet:有序、不重复、无索引。
  • TreeSet:排序(默认升序,若想自定义排序则需要自行设计比较规则)、不重复、无索引。

Set系列集合的功能基本上与Collection的API一致。

 3.2.1、HashSet

HashSet底层原理:

  • HashSet集合底层采取哈希表存储的数据。
  • 哈希表是一种对于增删改查数据性能都较好的结构。

 HashSet集合元素去重复的底层原理:

  1. 创建一个默认长度16的数组,数组名table
  2. 根据元素的哈希值数组的长度求余计算出应存入的位置(哈希算法
  3. 判断当前位置是否为null,如果是null直接存入
  4. 如果位置不为null,表示有元素,则调用equals方法比较
  5. 如果一样,则不存,如果不一样,则存入数组,

结论:如果希望Set集合认为2个内容一样的对象是重复的, 必须重写对象的hashCode()和equals()方法

        

3.2.2、LinkedHashSet

LinkedHashSet集合概述和特点:

  • 有序、不重复、无索引。
  • 这里的有序指的是保证存储和取出的元素顺序一致
  • 原理:底层数据结构是依然哈希表,只是每个元素又额外的多了一个双链表的机制记录存储的顺序。

3.2.3、TreeSet

TreeSet集合概述和特点:

  • 不重复、无索引、可排序
  • 可排序:按照元素的大小默认升序(有小到大)排序。
  • TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好。
  • 注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序。

Treeet默认的排序规则:

  • 对于数值类型:Integer , Double,官方默认按照大小进行升序排序
  • 对于字符串类型:默认按照首字符的编号升序排序
  • 对于自定义类型如Student对象,TreeSet无法直接排序。(想要TreeSet存储自定义类型,需要制定排序规则)

 

 4、Map集合体系

Map集合概述和使用:

  • Map集合是一种双列集合,每个元素包含两个数据
  • Map集合的每个元素的格式:key=value(键值对元素)。
  • Map集合也被称为“键值对集合”。

Map集合整体格式:

Collection集合的格式: [元素1,元素2,元素3..]

Map集合的完整格式:{key1=value1 , key2=value2 , key3=value3 , ...}

Map集合体系

 说明

        使用最多的Map是HashMap

        重点掌握HashMap、LinkedHashMap、TreeMap。

Map集合体系特点:

  • Map集合的特点都是由决定的。
  • Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。
  • Map集合后面重复的键对应的值会覆盖前面重复键的值。
  • Map集合的键值对都可以为null。

Map集合实现类的特点:

  • HashMap:元素按照键是无序,不重复,无索引,值不做要求。(与Map体系一致)
  • LinkedHashMap:元素按照键是有序,不重复,无索引,值不做要求。
  • TreeMap元素按照键是排序,不重复,无索引,值不做要求。

Map集合的API:

        Map集合 Map是双列集合的祖宗接口,它的功能是全部双列集合都可以继承使用的。

 4.1、HashMap

HashMap的特点: 

  • HashMap是Map里面的一个实现类。特点都是由键决定的:无序、不重复、无索引
  • 没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
  • HashMap跟HashSet底层原理是一模一样的,都是哈希表结构,只是HashMap的每个元素包含两个值而已。

实际上:Set系列集合的底层就是Map实现的,只是Set集合中的元素只要键数据,不要值数据而已。

4.2、LinkedHashMap

LinkedHashMap集合概述和特点:

  • 由键决定:有序、不重复、无索引。
  • 这里的有序指的是保证存储和取出的元素顺序一致
  • 原理:底层数据结构是依然哈希表,只是每个键值对元素又额外的多了一个双链表的机制记录存储的顺序。

 4.3、TreeMap

TreeMap集合概述和特点:

  • 由键决定特性:可排序、不重复、无索引
  • 可排序:按照键数据的大小默认升序(有小到大)排序。只能对键排序。
  • 注意:TreeMap集合是一定要排序的,可以默认排序,也可以将键按照指定的规则进行排序 TreeMap跟TreeSet一样底层原理是一样的。

TreeMap集合自定义排序规则有两种:

  1. TreeMap集合自定义排序规则有2种 类实现Comparable接口,重写比较规则。
  2. 集合自定义Comparator比较器对象,重写比较规则。

5、List、Set、Map三种对比

三种集合类型对比
List Set Map
可重复 不可重复 键不可重复、值可重复
有序 无序(LinkedHashSet有序、TreeSet可排序 无序(LinkedHashMap有序、TreeMap可排序
有索引 无索引 无索引
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础篇——集合 的相关文章

  • JAVA获取类的类对象的三种方式

    自定义一个类 MyClass 并声明该类的对象 class MyClass MyClass mClass1 new MyClass 1 2 3 在上面说过 Class 类的构造方法是私有的 只有 java 虚拟机可以调用该方法创建该类的对象
  • ThreadLocal学习

    1 threadLocal图解 java lang ThreadLocal类实现了线程的本地存储 ThreadLocal的内部实现 ThreadLocal的内部实现包括一个类似HashMap的对象 这里称之ThreadLocalMap Th
  • 各种注释总结

    jsp注释 html注释
  • Servlet 和 Cookie-Session 学习笔记(基础)

    简单来说 是运行在服务器端的 Java 程序 它作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 用处 使用 Servlet 您可以收集来自网页表单的用户输入 呈现来自数据库或者其他
  • ubuntu 11配置hadoop

    最近没事 研究下ubuntu 配置hadoop ubuntu版本 64 bit 11 04 hadoop版本 hadoop1 2 1 一 在Ubuntu下创建hadoop用户组和用户 1 创建hadoop用户组 sudo addgroup
  • 《编写高质量代码:改善Java程序的151个建议》读书笔记

    编写高质量代码 改善Java程序的151个建议 秦小波 67个笔记 前言 本书附带有大量的源码 下载地址见华章网站www hzbook com 建议11 养成良好习惯 显式声明UID SerialVersionUID 也叫做流标识符 Str
  • java 泛型 作用与定义

    1 泛型方法的定义和使用 public static void main String args throws ClassNotFoundException String str get 哈士奇 world System out print
  • Spring中的监听器与SpringMVC简述

    目录 Spring中的监听器 SpringMVC概述 web层的框架完成的相应的操作图示 SpringMVC开发使用步骤 SpringMVC流程图示 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转
  • 重试机制的实现(4m,10m,10m,1h,2h,6h,15h)

    项目场景 由于我们现在所做的项目有有很多的外放接口供代理商调用 但是有些接口的响应并不是实时返回的 此时我们就需要使用回调接口的方式 将信息响应给代理商 在这期间可能会出网络不稳定等其他情况 导致回调接口调用失败 所以需要特定的回调重试机制
  • 什么是Servlet容器?

    在本文中 我写了一些关于Web服务器 Servlet容器以及它与JVM的关系的基本概念 我想表达的是 Servlet容器也仅仅不过是一个Java程序 1 什么是Web服务器 想要知道什么是Servlet容器 我们首先要知道什么是Web服务器
  • JAVA WEB 中间件为SERVLET(四)

    写一个用户登录部署到tomcat 本地 先找到一个模板 HTML代码复制到本地的项目index jsp中 这个登录模板包含一个JSP 一个JS 三个CSS等文件 这个是index jsp代码
  • java文件上传

    简介 java文件上传 1 Commons FileUpload简介 1 Commons FileUpload组件 Commons是Apache开放源代码组织的一个Java子项目 其中的FileUpload是用来处理HTTP文件上传的子项目
  • Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web

    文章目录 前言 为何要写 目录结构 1 依赖配置 1 1 创建一个web项目 1 2 依赖需求分析 1 3 pom xml 2 配置Mybatis 2 1 mybatis config xml 2 2 UserMapper xml 2 3
  • AQS底层原理

    1 AQS能干嘛 是什么 能干嘛 加锁就会有阻塞 有阻塞就需要排队 实现排队必然需要有某种形式的队列来进行管理 是什么 废话 抽象的队列同步器 翻译一下 AQS是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石 通过内置的
  • JAVA 8 新特性及使用

    1 前言 2019年9月19日java13已正式发布 感叹java社区强大 经久不衰 由于国内偏保守 新东西总要放一放 让其他人踩踩坑 等稳定了才会去用 并且企业目的还是赚钱 更不会因为一个新特性去重构代码 再开发一套程序出来 甚者国内大多
  • 将Enum枚举转成Map,List结构

    JAVA枚举功能强大 感觉就像是一种简化版的类对象 可以有构造方法 可以重载 可以继承接口等等 JAVA枚举在实际开发中应用相当频繁 以下几个封装方法在实际开发中可能用到 将枚举类转化为Map以及List结构的一些操作方法 首先 新建一个枚
  • 如何做单元测试

    如何做单元测试 一 定义 二 为什么要做单元测试 三 单元测试用例 四 阿里单元测试规约 五 测试框架的使用 Junit 下面以Junit4 为例来介绍 1 1 什么是Junit 1 2 为何使用Junit 1 3 Junit的快速入门 导
  • mysql无法连接问题及其环境变量配置

    问题 Can t connect to MySQL server on localhost 3306 10061 方案一 不推荐 第一 在环境变量 系统变量的path中添加mysql的bin目录 我的是D mysql mysql 8 0 2
  • 黑豹程序员-统一身份认证接口

    术语和定义 1 IAM Identity Access Manager 统一身份认证系统 2 IDM Identity Manager 身份管理 3 SSO Single Sign On 单点登录 4 AD Active Directory
  • java毕业设计

    包含部署视频 1 基于ssh的婴幼儿产品销售系统毕业设计 项目报告 答辩PPT 源代码 数据库 截图 部署视频 2 基于jsp的医院管理住院系统毕业设计 项目报告 答辩PPT 源代码 数据库 部署视频 3 基于ssh的医院在线挂号系统毕业设

随机推荐

  • 执行思维和管理思维学习有感

    已经不记得从何时起 我手下开始有组员 我成了组长 主管 当然还有一个好听的名字 基层管理者 但是我的工作内容貌似没变 依旧执行着原来的工作 做计划 跟踪执行 解决执行过程中的难题 甚至碰到不靠谱的同事直接自己上手 天天来的最早走的最晚 组员
  • 【jeecg-boot】解决:登录 http://localhost:3000/ 前端,显示登录已过期

    问题 原因 redis没有启动 或者redis设置了密码 解决 启动redis 设置密码的用户请修改
  • GPU架构中的半精度fp16与单精度fp32计算

    GPU架构中的半精度与单精度计算 由于项目原因 我们需要对darknet中卷积层进行优化 然而对于像caffe或者darknet这类深度学习框架来说 都已经将卷积运算转换成了矩阵乘法 从而可以方便调用cublas 库函数和cudnn里til
  • linux日志查看命令

    1 查看日志常用命令 tail n 是显示行号 相当于nl命令 例子如下 tail 100f test log 实时监控100行日志 tail n 10 test log 查询日志尾部最后10行的日志 tail n 10 test log
  • gravatar配置和使用【让你的网站使用全球通用头像】

    前言 我们在很多博客或者网站留言 评论的时候会看到有的人头像很酷很个性化 但是这个博客和网站本身并没有提供设置头像的功能 感觉有点神奇 那么是怎么做到的呢 其实这是使用了Gravatar Gravatar是Globally Recogniz
  • hibernate无法找到实体类

    找不到持久化类 第一次编写博客 我的博客是用来记录编程出现过的错误 org hibernate UnknownEntityTypeException Unable to locate persister 翻译 未知实体类型异常 找不到持久化
  • TortoiseSVN设置忽略文件和目录文件夹

    参看 https blog csdn net bbj12345678 article details 80949556
  • sql server 查询表是否被哪些存储过程和视图引用

    select name from sysobjects as s inner join syscomments as o on s id o id where text like N 表名
  • GFS 阅读笔记

    这篇博客是我阅读著名的 GFS 论文 The Google File System 所总结的笔记以及自己一些的思考 这篇论文是一篇非常经典的论文 尤其对于想要了解分布式或者刚刚开始研究分布式的人来说 是一篇非常好的读物 它里面提到了许多分布
  • 使用python代码绘制一个会动的爱心

    你可以使用 matplotlib 库来绘制一个会动的爱心 下面是一个简单的代码示例 import matplotlib pyplot as plt import numpy asnp x np linspace np pi np pi 25
  • Apache Beam中的有状态计算

    Beam帮助我们处理流式 乱序 大规模的数据 并且提供了高度的抽象机制Pipeline 统一了流式和批量数据处理 从功能上流处理可以分为无状态 stateless 的和有状态 stateful 两种 在流处理的框架里引入状态管理大大提升了系
  • mysql怎么打开表ddl_MySQL数据表操作(DDL)

    一 创建数据表 语法 create table 表名称 字段 字段类型 约束 字段 字段类型 约束 表选项 约束 primary key not null auto increment等 表选项 数据表的属性 一般包括engine char
  • linux常用命令及解释大全(三)

    目录 前言 一 字符设置和文件格式转换 二 文件系统分析 三 初始化一个文件系统 四 备份 五 光盘 六 网络 总结 前言 本篇文章继续介绍了一部分linux常用命令 包括字符设置和文件格式转换 文件系统分析 初始化一个文件系统 备份 光盘
  • 模板类,模板类函数特例化,模板类特例化

    今天在看某c 框架源码时 发现模板类里的部分函数可以特例化 感觉很神奇便尝试了下 发现很多平时不会注意的c 细节及知识 写下来分享给大家 以便大家遇到相似问题时可以少踩点坑 模板类会出现链接问题 编译不通过 如果模板类 h文件和 cpp文件
  • matlab_一组数据元素随机排列

    如何生成一组数据元素随机排列 随机打乱顺序 产生新的排列 1 使用的matlab函数 randperm 1 语法格式 R randperm n 2 函数功能 将数字1 n进行随机排列 排列结果存储在行向量内 3 EX 输入 randperm
  • 网页端扫码通过公众号实现微信授权登录

    1 参考开发文档 https developers weixin qq com doc offiaccount OA Web Apps Wechat webpage authorization html 0 2 先调起微信授权页面 获取co
  • Java学习心得2——构造函数

    1 什么是构造函数 构造函数顾名思义 就是对象被构造的时候就会被调用的函数 例如当你new一个Cat对象的时候 Cat对象的构造函数就会被调用 public static void main String args Cat c new Ca
  • (如何读写文件)流-------输入流

    流 流是一组有序的数据序列 通过流来读写文件 流从方向分输入 输出流 流从单位份字节 字符流 字节输入流 InputStream 抽象父类 基类 常用方法 read 几个重载方法作用不同 int read 输入流一个字节一个字节的读 返回的
  • U3D中对象的自动销毁

    很多游戏中都会重用同一个游戏对象 比如说Dota 一波兵一波兵的被对方消灭 如果尸体不会自动销毁 恐怕地图中的尸体堆积如山不说 配置再厉害的电脑也架不住 这样游戏的性能太低了 需要自动销毁的情形有 游戏对象已经并且永远消失在视野中了 天空中
  • Java基础篇——集合

    活动地址 CSDN21天学习挑战赛 1 为什么使用集合 集合与数组类似 都是容器 我们为什么不用数组而还要使用集合呢 数组的特点 数组定义完成并启动后 类型确定 长度固定 不适合元素的个数和类型不确定的业务场景 更不适合做需要增删的操作 数