Java集合(Collection+Map)

news2024/11/16 15:21:19

Java集合(Collection+Map)

    • 为什么要使用集合?
    • 泛型 <>
    • 集合框架
    • 单列集合Collection
      • Collection遍历方式
      • List:有序、可重复、有索引
        • ArrayList
        • LinkedList
        • Vector(已经淘汰,不会再用)
      • Set:无序、不重复、无索引
        • HashSet
          • LinkedHashSet
        • TreeSet
    • 双列集合Map
      • HashMap
        • LinkedHashMap
      • HashTable(后续补充)
        • Properties
      • TreeMap
    • Collections 集合工具类

来自黑马,把视频截图保存,主要为了自己方便查找。

为什么要使用集合?

当有很多数据需要存储时,会想到用数组,而数组需要在定义时指定长度,而我们希望有一个可变长度的容器——集合。
集合可以自动扩容,提高了数据存储的灵活性,Java 集合不仅可以用来存储不同类型不同数量的对象,还可以保存具有映射关系的数据。
在这里插入图片描述

泛型 <>

在这里插入图片描述

集合框架

在这里插入图片描述

红色表示接口,蓝色表示实现类:
在这里插入图片描述
在这里插入图片描述
键和值之间一一对应。键值对也成为键值对对象,或者是Entry对象。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

单列集合Collection

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在Java里面,字符串已经重写好了equals方法。

在这里插入图片描述

Collection遍历方式

以前的普通的for循环的遍历方式适用于有索引的list系列,而没有索引的set系列不能用。

1. 迭代器遍历
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2. 增强for遍历
在这里插入图片描述
在这里插入图片描述
3. lambda表达式遍历
在这里插入图片描述
一行搞定:
在这里插入图片描述

List:有序、可重复、有索引

在这里插入图片描述

  • 添加元素:添加完之后,原来索引上的元素会依次后移。
  • 删除元素:下面第一个会删除1索引,第二个装箱了,会删除“1”
    在这里插入图片描述

独有的遍历方式: 继承了Collection的遍历方式。

  1. 迭代器
  2. 增强for
  3. Lambda表达式
  4. 普通for循环(因为List集合存在索引)
    在这里插入图片描述
  5. 列表迭代器遍历
    在这里插入图片描述
    总结:
    在这里插入图片描述
ArrayList

在这里插入图片描述

输出是 []

在这里插入图片描述

import java.util.*;
public class Main {

    public static void main(String[] args) {
        //1.创建一个集合
        ArrayList<String> list = new ArrayList<>();
        System.out.println(list);  //[]

        //2.添加元素: 对于add方法,在ArrayList里面,不管添加什么,都会返回true
//        boolean result = list.add("aaa");
//        System.out.println(result);  //true
//        System.out.println(list);  //[aaa]
        // 所以一般直接添加元素就行,不用管返回值
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        System.out.println(list);  //[aaa, bbb, ccc]

        //3.删除元素
        list.remove("aaa");
        System.out.println(list);  //[bbb, ccc]

        String str = list.remove(0);  //这里也可以不接收返回值,直接list.remove(0)
        System.out.println(str);  //bbb
        System.out.println(list);  //[ccc]

        //4.修改元素
        String str1 = list.set(0, "ddd");
        System.out.println(str1);  //ccc,返回被覆盖的元素
        System.out.println(list);  //[ddd],结果就是覆盖以后的

        //5.查询元素
        String str2 = list.get(0);
        System.out.println(str2);  //ddd,获取单个元素

        //遍历
        list.add("eee");
        list.add("fff");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));  //依次输出ddd eee fff
        }
        System.out.println(list);  //[ddd, eee, fff],直接打印就是集合
    }
}
LinkedList

在这里插入图片描述
我们在项目中一般是不会使用到 LinkedList 的,需要用到 LinkedList 的场景几乎都可以使用 ArrayList 来代替,并且,性能通常会更好!就连 LinkedList 的作者约书亚 · 布洛克(Josh Bloch)自己都说从来不会使用 LinkedList 。

另外,不要下意识地认为 LinkedList 作为链表就最适合元素增删的场景。我在上面也说了,LinkedList 仅仅在头尾插入或者删除元素的时候时间复杂度近似 O(1),其他情况增删元素的时间复杂度都是 O(n) ,因为需要从头或尾开始寻找!

Vector(已经淘汰,不会再用)

Set:无序、不重复、无索引

在这里插入图片描述

set遍历:
在这里插入图片描述

首先添加元素,如果是第一次添加,返回True,第二次就不行了,返回False:
在这里插入图片描述

遍历:
在这里插入图片描述

HashSet

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
加载因子表示的是扩容时机,当数组里面的元素到了16*0.75=12个的时候,数组长度就加倍,变成了32。而当链表长度大于8而且数组长度大于等于64,就会自动编程红黑树:
在这里插入图片描述

了解了底层原理,就可以回答HashSet的问题:
在这里插入图片描述
如图所示,读取的顺序是图中的123456,但是存的顺序就不一定了。

问题2:HashSet为什么没有索引?
图中1索引对应的位置有好几个元素,不好区分,所以干脆无索引。

问题3:HashSet是利用什么机制保证数据去重的?
用HashCode方法和equals方法,所以如果集合中存储的是自定义对象(如Student),一定要根据对象的属性重写这两个方法,要不然就会比较地址值!

这里为什么会强调自定义对象要重写:如果存储的是基本数据类型的包装类,已经正确地重写了hashCode()和equals()方法。对于 Java 标准库中的许多类(如String),也已经合理地重写了hashCode()和equals()方法。

LinkedHashSet

在这里插入图片描述
在这里插入图片描述
添加进去的1和2,2和3,3和4……两两之间有双向链表,互相记录地址值。遍历的时候也是从1开始遍历。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

TreeSet

在这里插入图片描述

在这里插入图片描述
如果字符串里面字母很多,那就从第一个字母开始比较:
“aaa” > “ab” > “aba” > “cd” > “qwer”

双列集合Map

在这里插入图片描述
①添加
在这里插入图片描述
在这里插入图片描述

②删除
在这里插入图片描述
在这里插入图片描述

Map的三种遍历方式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

HashMap

在这里插入图片描述
在这里插入图片描述
存储的时候只比较的属性值,如果一样,就要覆盖,这一点和Set不同(Set是不存)! 这就是put里面覆盖的功能!
在这里插入图片描述

  1. HashMap底层是哈希表结构的
  2. 依赖hashCode方法和equals方法保证键的唯一
  3. 如果存储的是自定义对象,需要重写hashCode和equals方法
    如果存储自定义对象,不需要重写hashCode和equals方法
LinkedHashMap

在这里插入图片描述
在这里插入图片描述

HashTable(后续补充)

Properties

TreeMap

在这里插入图片描述

在这里插入图片描述
这样直接输出已经是升序,如果要降序:
在这里插入图片描述

Collections 集合工具类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

大数据如何助力干部选拔的公正性

随着社会的发展和进步&#xff0c;干部选拔成为组织管理中至关重要的一环。传统的选拔方式可能存在主观性、不公平性以及效率低下等问题。大数据技术的应用&#xff0c;为干部选拔提供了更加全面、精准、客观的信息支持&#xff0c;显著提升选拔工作的科学性和公正性。以下是大…

EHOME视频平台EasyCVR多品牌摄像机视频平台监控视频编码H.265与Smart 265的区别?

在视频监控领域&#xff0c;技术的不断进步推动着行业向更高效、更智能的方向发展。特别是在编码技术方面&#xff0c;Smart 265作为一种新型的视频编码技术&#xff0c;相较于传统的H.265&#xff0c;有明显优势。这种技术的优势在EasyCVR视频监控汇聚管理平台中得到了充分的体…

Docker:查看镜像里的文件

目录 背景步骤1、下载所需要的docker镜像2、创建并运行临时容器3、停止并删除临时容器 背景 在开发过程中&#xff0c;为了更好的理解和开发程序&#xff0c;有时需要确认镜像里的文件是否符合预期&#xff0c;这时就需要查看镜像内容 步骤 1、下载所需要的docker镜像 可以使…

【Vitepress报错】Error: [vitepress] 8 dead link(s) found.

原因 VitePress 在编译时&#xff0c;发现 死链接(dead links) 会构建失败&#xff01;具体在哪我也找不到… 解决方案 如图第一行蓝色提示信息&#xff0c;设置 Vitepress 属性 ignoredeadlinks 为 true 可忽略报错。 .vuepress/config.js export default defineConfig(…

HTB:Squashed[WriteUP]

目录 连接至HTB服务器并启动靶机 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机开放端口进行脚本、服务扫描 使用浏览器访问靶机80端口页面 使用showmount列出靶机上的NFS共享 新建一个test用户 使用Kali自带的PHP_REVERSE_SHELL并复制到一号挂载点 尝试使用c…

数据分析-48-时间序列变点检测之在线实时数据的CPD

文章目录 1 时间序列结构1.1 变化点的定义1.2 结构变化的类型1.2.1 水平变化1.2.2 方差变化1.3 变点检测1.3.1 离线数据检测方法1.3.2 实时数据检测方法2 模拟数据2.1 模拟恒定方差数据2.2 模拟变化方差数据3 实时数据CPD3.1 SDAR学习算法3.2 Changefinder模块3.3 恒定方差CPD3…

ThriveX 博客管理系统前后端项目部署教程

前端 前端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Blog 控制端项目地址&#xff1a;https://github.com/LiuYuYang01/ThriveX-Admin Vercel 首先以 Vercel 进行部署&#xff0c;两种方式部署都是一样的&#xff0c;我们以前端项目进行演示 首先我们先…

Seata源码笔记(三)

Seata源码笔记&#xff08;三&#xff09; RPC部分基础接口AbstractNettyRemotinginit方法send方法&#xff08;仅看sendSync&#xff09;sendSync中的钩子 AbstractNettyRemotingClient 基于incubator-seata-2.x RPC部分 基础接口 AbstractNettyRemoting init方法 主要设置…

Verilog HDL学习笔记

Verilog HDL&#xff08;Hardware Description Language&#xff09;是在一种硬件描述语言&#xff0c;类似于计算机的高级编程设计语言&#xff0c;它具有灵活性高&#xff0c;容易学习和使用等特点&#xff0c;同时Verilog能够通过文本的形式来描述数字系统的硬件结构和功能。…

java-Day07 包装类 异常+自定义异常

包装类 包装类:将基本数据类型包装成引用数据类型 int-Integer char-Character double-Double 其余都大写 包装类好处 1.包装类的存在弥补了基本数据类型的不足。在集合类中&#xff0c;无法将int 、double等类型放进去&#xff0c;因为集合的容器要求元素是Object类型。…

10款高效音频剪辑工具,让声音编辑更上一层楼。

音频剪辑在音频&#xff0c;视频&#xff0c;广告制作&#xff0c;游戏开发&#xff0c;广播等领域中都有广泛的应用。通过音频剪辑&#xff0c;创作者可以通将不同的音频片段进行剪切、拼接、混音等操作&#xff0c;创作出风格各异的音乐作品。如果你也正在为音频创作而努力的…

释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o

在不断发展的人工智能领域&#xff0c;Nexusflows 推出了 Athene-V2-Agent 作为其模型系列的强大补充。这种专门的代理模型设计用于在功能调用和代理应用中发挥出色作用&#xff0c;突破了人工智能所能达到的极限。 竞争优势 Athene-V2-Agent 不仅仅是另一种人工智能模型&…

SRP 实现 Cook-Torrance BRDF

写的很乱&#xff01; BRDF&#xff08;Bidirectional Reflectance Distribution Function&#xff09;全称双向反射分布函数。辐射量单位非常多&#xff0c;这里为方便直观理解&#xff0c;会用非常不严谨的光照强度来解释说明。 BRDF光照模型&#xff0c;上反射率公式&#…

SDF,一个从1978年运行至今的公共Unix Shell

关于SDF 最近发现了一个很古老的公共Unix Shell服务器&#xff0c;这个项目从1978年运行至今&#xff0c;如果对操作系统&#xff0c;对Unix感兴趣&#xff0c;可以进去玩一玩体验一下 SDF Public Access UNIX System - Free Shell Account and Shell Access 注册方式 我一…

机器学习基础02_特征工程

目录 一、概念 二、API 三、DictVectorize字典列表特征提取 四、CountVectorize文本特征提取 五、TF-IDF文本1特征词的重要程度特征提取 六、无量纲化预处理 1、MinMaxScaler 归一化 2、StandardScaler 标准化 七、特征降维 1、特征选择 VarianceThreshold 底方差…

[前端面试]javascript

js数据类型 简单数据类型 null undefined string number boolean bigint 任意精度的大整数 symbol 创建唯一且不变的值&#xff0c;常用来表示对象属性的唯一标识 复杂数据类型 object&#xff0c;数组&#xff0c;函数,正则,日期等 区别 存储区别 简单数据类型因为其大小固定…

[DEBUG] 服务器 CORS 已经允许所有源,仍然有 304 的跨域问题

背景 今天有一台服务器到期了&#xff0c;准备把后端迁移到另一台服务器上&#xff0c;结果前端在测试的时候&#xff0c;出现了 304 的跨域问题。 调试过程中出现的问题&#xff0c;包括但不限于&#xff1a; set the request’s mode to ‘no-cors’Redirect is not allow…

深入理解接口测试:实用指南与最佳实践5.0(五)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

头歌网络安全(11.12)

头歌禁止复制解决 必须先下篡改猴&#xff01;&#xff01;&#xff01;&#xff01; 头歌复制助手 Educoder Copy Helperhttps://scriptcat.org/zh-CN/script-show-page/1860 Java生成验证码 第1关&#xff1a;使用Servlet生成验证码 任务描述 本关任务&#xff1a;使用se…

项目管理人员的自我评估与职业目标设定

在当今快速发展的商业环境中&#xff0c;项目管理人员的职业规划至关重要。它不仅涉及到个人职业发展的方向、目标和路径选择&#xff0c;还包括如何提升自身的专业技能、管理能力和行业知识。项目管理人员需要明确自己的职业目标、制定合理的职业发展计划、不断学习新知识和技…