Java集合简略记录

news2025/1/21 17:52:56

一、集合体系结构

        单列集合:Collection

        双列集合:Map

二、单列集合

List系列集合:添加的元素是有序、可重复、有索引
有序指的是存和取的顺序是一致的,和之前排序的从小到大是没有任何关系的

Set系列集合:添加的元素是无序、不重复、无索引

2.1、Collection

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

public boolean add(E e)把给定的对象添加到当前集合中
public void clear()清空集合中所有的元素
public boolean remove(E e)把给定的对象在当前集合中删除
public boolean contains(Object obj)判断当前集合中是否包含给定的对象
public boolean isEmpty()判断当前集合是否为空
public int size()返回集合中元素的个数/集合的长度

代码实例

2.1.1、添加元素

public class CollectionTest {
    public static void main(String[] args) {
        /*
            Collection是一个接口,我们不能直接创建他的对象
            所以,现在我们为了学习Collection的方法时,只能创建他实现类的对象。
            实现类:ArrayList 作为一个例子
            目的:为了学习Collection接口里面的方法
         */

        //自己练习的时候按照自己的方式创建就行
        Collection<String> collection =new ArrayList<>();

        //添加元素
        //细节一:如果我们要往List系列集合中添加元素,那么方法永远返回true,因为List系列的是允许元素重复的。
        //细节二:如果要往Set系列集合中添加元素,如果当前要添加元素不存在,方法返回true,表示添加成功。
        //                                如果当前要添加元素已经存在,方法返回false,表示添加失败。
        //                                因为Set系列的集合不允许元素重复。
        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        System.out.println(collection);
    }
}

运行结果:

2.1.2、清空集合

public class CollectionTest {
    public static void main(String[] args) {

        Collection<String> collection =new ArrayList<>();

        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        System.out.println(collection);

        //清空集合
        collection.clear();
        System.out.println(collection);
    }
}

运行结果:

2.1.3、删除元素

package cn.ysy.collection;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionTest {
    public static void main(String[] args) {

        Collection<String> collection =new ArrayList<>();

        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        System.out.println(collection);


        //删除
        //细节一:因为Collection里面定义的是共性的方法(要同时兼顾到List和Set),所以此时不能通过索引进行删除,只能通过元素的对象进行删除。
        //细节二:方法会有一个布尔类型的返回值,删除成功返回ture,删除失败返回false。
        System.out.println(collection.remove("张三"));
        System.out.println(collection);
    }
}

运行结果:

2.1.4、判断元素是否存在

public class CollectionTest {
    public static void main(String[] args) {
        Collection<String> collection =new ArrayList<>();


        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        System.out.println(collection);

        //判断元素是否包含
        //细节:底层是依赖equals方法进行判断是否存在的。
        //所以,如果集合中存储的是自定义对象,也想用过contains方法来判断是否包含,那么在javabean类中,一定要重写equals方法。
        //在String中,==比较引用地址是否相同,equals()比较字符串的内容是否相同
        System.out.println(collection.contains("张三"));

    }
}

运行结果:

引申:如果是自定义对象,又该怎么比较呐?

创建一个User实体类:

public class User {
    private String name;
    private int age;


    public User() {
    }

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "User{name = " + name + ", age = " + age + "}";
    }
    
    //重写equals方法
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return age == user.age && Objects.equals(name, user.name);
    }

}

再写一个Collection测试类:

public class CollectionTest02 {
    public static void main(String[] args) {
        //1.创建集合对象
        Collection<User> collection =new ArrayList<>();

        //2.创建三个用户对象
        User user1 = new User("张三", 20);
        User user2 = new User("李四", 21);
        User user3 = new User("王五", 22);

        //3.将User对象添加到集合中
        collection.add(user1);
        collection.add(user2);
        collection.add(user3);

        //4.判断集合中某一个use对象是否包含
        User user4 = new User("张三", 20);

        //如果同姓名和年龄,则认为是同一个用户,结果应该是true,但是真实运行结果却是false
        //因为contains方法底层调用的是equals方法
        //如果存的是自定义对象,没有重写equals,那么默认使用Object类中的equals方法进行判断
        //而Object类中的equals方法比较的是地址值

        //需求:如果同姓名和年龄,则认为是同一个用户,结果应该是true
        //所以,需要在自定义的javabean类中,重写equals方法就可以了
        System.out.println(collection.contains(user4));

    }
}

没重写equals方法的话,打印结果是false,重写之后,打印结果就是true了

2.1.5、判断集合是否为空和获取集合长度

public class CollectionTest {
    public static void main(String[] args) {
       
        Collection<String> collection =new ArrayList<>();

       
        collection.add("张三");
        collection.add("李四");
        collection.add("王五");
        System.out.println(collection);

       
        //判断集合是否为空
        System.out.println(collection.isEmpty());

        //获取集合的大小
        System.out.println(collection.size());
    }
}

运行结果:

2.1.6、Collection的遍历方式

迭代器遍历

增强for遍历

lambda表达式

之所以不用普通的for遍历,因为set集合中没有索引,所以不能通过普通for进行遍历

2.1.6.1、迭代器遍历 

迭代器在java中的类是Iterator,迭代器是集合专用的遍历方式。

迭代器遍历集合的时候是不依赖索引的


Collection集合获取迭代器
Iterator<E> iterator()                          返回迭代器对象,默认指向当前集合的0索引


Iterator中的常用方法

boolean hasNext()                             判断当前位置是否有元素,有元素返回tru额,反之false

E next()                                              获取当前位置的元素,并将迭代器对象移向下一个位置

public class CollectionIteratorTest {
    public static void main(String[] args) {
        Collection<String> collection =new ArrayList<>();

        //添加元素
        collection.add("a");
        collection.add("b");
        collection.add("c");
        collection.add("d");

        //创建迭代器
        Iterator<String> iterator = collection.iterator();

        //利用迭代器遍历集合
        while(iterator.hasNext()){
            String result = iterator.next();
            System.out.println(result);
        }
    }
}

细节注意点:

1、当遍历完成时,还强行调用next()方法取获取元素时,就会报错NoSuchElementException

2、迭代器遍历完毕,指针不会复位

3、循环中智能用一次next方法

4、迭代器遍历时,不能用集合的方法进行增加或者删除

2.1.6.2、增强for遍历 
  • 增强for的底层就是迭代器,为了简化迭代器的代码书写的
  • 它是JDK5之后出现的,其内部原理就是一个Iterator迭代器
  • 所有的单列集合和数组才能用增强for进行遍历

格式:

for (元素的数据类型   变量名  :     数组或者集合){


}

idea快捷生成    集合名.for




增强for的细节:

修改增强for中的变量,不会改变集合中原本的数据

for(String s : list){
    System.out.println(s);
}
2.1.6.3、Lambda表达式遍历

得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。

collection.forEach(s -> System.out.println(s));

 2.2、List

  • Collection的方法List都继承了
  • List集合因为有索引,所以多了很多索引操作的方



    void add(int index,E element)      在此集合中的指定位置插入指定的元素

    E remove(int index)                      删除指定索引处的元素,返回被删除的元素

    E set(int index,E element)            修改指定索引处的元素,返回被修改的元素

    E get(int index)                              返回指定索引处的元素




    细节:利用remve删除元素时,如果类型是整数,那么此时删除的是1这个元素,还是1索引上的元素?为什么?

    因为在调用方法的时候,如果方法出现了重载现象,有限调用:实参跟形参类型一致的那个方法。
    比如:list.remove(1)  删除的就是1索引位置的元素



    如果要删除整数1,则可以手动装箱,将基本数据类型的1,变成Integer类型

    Integer i = Integer.valueOf(1);
    list.remove(i);//  此时删除的就是元素1了

2.3.1、List集合的遍历方式

2.3.1.1、迭代器
//迭代器
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
2.3.1.2、列表迭代器
//列表迭代器遍历
//获取一个列表迭代器的对象,里面的指针默认也是指向0索引的 
//额外添加了一个方法;在遍历的过程中,可以添加元素
        ListIterator<String> it = list.listIterator();
        while (it.hasNext()){
            String next = it.next();
            if ("2".equals(next)){
                it.add("qqqq");
            }
        }
        System.out.println(list);

不能使用集合的方法取添加,比如list.add()会报错并发修改异常,所以要用迭代器本身的方法进行添加

结果:

2.3.1.3、增强for
//增强for
        for (String s : list) {
            System.out.println(s);
        }
2.3.1.4、Lambda表达式
//Lambda表达式
        list.forEach(s -> System.out.println(s));
2.3.1.5、普通for循环
//普通for循环遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }

2.3.2、五种遍历方式的对比

2.3、数据结构

2.3.1、栈

栈的特点 :先进后出

数据进入栈模型的过程称为:压/进栈

数据离开栈模型的过程称为:弹/出栈 

2.3.2、队列 

队列特点:先进先出

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

2.3.3、数组 

数组是一种查询快,增删慢的模型

查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)

删除效率低:要将原始数据删除,同时后面每个数据前移

添加效率低:添加位置后的每个数据后移,再添加元素

2.3.4、链表 

链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。

链表查询慢,无论查询哪个数据都要从头开始找

链表增删相对快

2.3.5、树

二叉查找树:

添加节点规则:

遍历方式:

前序遍历:

中序遍历:

后序遍历:

层序遍历:

平衡二叉树:

红黑树:

2.4、ArrayList 

底层原理:

源码分析

情况一:初始长度为0

情况二:当集合长度满时

2.5、LinkedList

源码分析

2.6、迭代器源码

2.7、泛型 

泛型的好处:


2.8、Set

2.9、HashSet

2.10、LinkedHashSet

2.11、TreeSet

三、双列集合

3.1、Map

3.1.1、Map的三种遍历方式

3.2、HashMap

3.3、LinkedHashMap

3.4、TreeMap

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

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

相关文章

RandLA-Net 训练自定义数据集

https://arxiv.org/abs/1911.11236 搭建训练环境 git clone https://github.com/QingyongHu/RandLA-Net.git搭建 python 环境 , 这里我用的 3.9conda create -n randlanet python3.9 source activate randlanet pip install tensorflow2.15.0 -i https://pypi.tuna.tsinghua.e…

从CSV到数据库(简易)

需求&#xff1a;客户上传CSV文档&#xff0c;要求CSV文档内容查重/插入/更新相关数据。 框架&#xff1a;jdbcTemplate、commons-io、 DB&#xff1a;oracle 相关依赖&#xff1a; 这里本来打算用的2.11.0&#xff0c;无奈正式项目那边用老版本1.3.1&#xff0c;新版本对类型…

eNSP学习——RIP路由协议基础配置

目录 主要命令 原理概述 实验内容 实验目的 实验拓扑 实验编址 实验步骤 1、基本配置 2、使用RIPv1搭建网络 开启 RIP调试功能 3、使用RIPv2搭建网络 RIPv1和RIPv2的不同 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大全PD…

使用Python库Matplotlib绘制常用图表类型

使用Python库Matplotlib绘图 一、Matplotlib绘图参数设置1.1 设置分辨率和画布大小1.2 保存图片并设置边缘留白为紧凑型1.3 设置坐标轴标签1.4 画直线设置线宽和颜色1.5 画子图1.5.1 通过figure的add_subplot()画子图1.5.2 通过plt的subplots画子图 二、使用Matplotlib中scatte…

经验分享,超声波车位引导系统和视频车位引导系统有哪些区别

随着城市化进程的加速和汽车保有量的持续增长&#xff0c;停车难已成为城市交通管理的一大挑战。车位引导系统作为解决这一问题的有效工具&#xff0c;其重要性日益凸显。它不仅能够提升停车场的运营效率&#xff0c;还能显著改善驾驶者的停车体验。目前市场上主要有两种车位引…

【Centos7】CentOS 7下的PyTorch安装策略:高效实践指南

【Centos7】CentOS 7下的PyTorch安装策略&#xff1a;高效实践指南 大家好 我是寸铁&#x1f44a; 总结了一篇【Centos7】CentOS 7下的PyTorch安装策略&#xff1a;高效实践指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 由于需要跑深度学习&#xff0c;要用到pytorch&a…

全域外卖项目能不能做?可行性分析来了!

作为新的网络热词&#xff0c;全域外卖的传播范围随着时间的推移而不断扩大&#xff0c;从最初的行业内部逐步扩散到多个创业者社区&#xff0c;让许多创业者都有了做全域外卖项目的想法。但是&#xff0c;由于全域外卖赛道刚兴起不久&#xff0c;因此&#xff0c;目前大多数人…

实时监控与报警:人员跌倒检测算法的实践

在全球范围内&#xff0c;跌倒事件对老年人和儿童的健康与安全构成了重大威胁。据统计&#xff0c;跌倒是老年人意外伤害和死亡的主要原因之一。开发人员跌倒检测算法的目的是通过技术手段及时发现和响应跌倒事件&#xff0c;减少因延迟救助而造成的严重后果。这不仅对老年人群…

Mysql(一)查询Sql是如何执行的

Hello&#xff0c;大家好我是极客涛&#x1f60e;&#xff0c;我最近在整理Mysql相关的知识点&#xff0c;所以准备开启一个Mysql的主线任务&#xff0c;大概耗时3周左右&#xff0c;整个节奏还是由浅入深&#xff0c;主要包括Mysql的架构、事务实现、索引组织形式、SQL优化、日…

[C][数据结构][时间空间复杂度]详细讲解

目录 0.铺垫1.时间复杂度 -- 衡量算法的运行快慢1.是什么&#xff1f;2.大O的渐进表示法 2.空间复杂度 - 衡量算法所需要的额外空间3.常见复杂度对比 0.铺垫 时间是累计的空间是不累计的&#xff0c;可以重复利用 1.时间复杂度 – 衡量算法的运行快慢 1.是什么&#xff1f; …

SQL Server数据库UNC路径注入攻击

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 UNC路径注入 如果我们能强制SQL服务器连接到我们控制的SMB共享&#xff0c;连接将会包含认证数据。更具体的来说&#xff0c;将会发起一个NTLM认证&#xff0c;我们将能…

词法分析器的设计与实现--编译原理操作步骤,1、你的算法工作流程图; 2、你的函数流程图;3,具体代码

实验原理&#xff1a; 词法分析是编译程序进行编译时第一个要进行的任务&#xff0c;主要是对源程序进行编译预处理之后&#xff0c;对整个源程序进行分解&#xff0c;分解成一个个单词&#xff0c;这些单词有且只有五类&#xff0c;分别时标识符、关键字&#xff08;保留字&a…

【实物+仿真设计】智能安全门控制系统设计

《智能安全门控制系统设计 实物仿真》 整体功能&#xff1a; 本课题首先确定整个智能安全门控制系统进行总体方案设计。主要包括按键模块、 电磁锁模块、语音提示模块、人员检测模块。按键提供给用户人工交互的功能&#xff0c;用户可 以选择输入按键的方式控制安全门。单片机…

民国漫画杂志《时代漫画》第39期.PDF

时代漫画39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了&#xff0c;截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

市场凌乱,智能算法哪种效果好?

当我们在面对市场波动&#xff0c;个股震荡&#xff0c;无从下手的时候&#xff0c;不懂算法的朋友就只懂做t&#xff1b;懂算法的朋友这会儿就迷茫并不知道选择哪种智能算法交易&#xff1f;今天小编给大家整理一套性价比高的&#xff0c;适合个人投资者搞的算法交易&#xff…

【SITS_CC】卫星图像时间序列的变化字幕(IEEE GRSL)

摘要 Satellite images time series (SITS) 提供了一种有效的方法来同时获取地球上观测区域的时间和空间信息。然而&#xff0c;传统的遥感CD方法的输出是二进制图或语义变化图&#xff0c;往往难以被最终用户解释&#xff0c;传统的遥感图像变化字幕方法只能描述双时图像。提…

湖南(品牌定位)源点咨询 企业如何选择品牌定位差异化调研

湖南源点认为&#xff1a;精准且占据消费者认知&#xff0c;探寻与消费者共鸣的常态化品牌定位调研是企业品牌长远健康发展的基石。 品牌定位里要强调品牌的差异。英文是point of difference. 这个差异点就是强调品牌能带来的利益&#xff08;benefit&#xff09;。 这个“利…

C++编程:模板初阶

目录 一、泛型编程 1、通用版交换函数的实现&#xff1a; 2、模板的引入 二、函数模板 1、函数模板的定义和使用 2、函数模板的实例化 三、类模板 1、类模板的定义和实例化 模板是C的一项强大特性&#xff0c;犹如中国古代四大发明中的活字印刷术与造纸术融为一体一般&a…

【学习】测试用例设计与执行的黄金法则

在软件测试领域&#xff0c;测试用例的设计与执行是确保产品质量的关键环节。一个优秀的测试用例能够揭示软件中的缺陷&#xff0c;而高效的执行则能保障测试覆盖的全面性。如同璀璨的星辰指引航船前行&#xff0c;以下黄金法则将引领测试用例设计与执行的过程&#xff0c;确保…

uniapp内置的button组件的问题

问题描述 由于想要使用uniapp内置button组件的开放能力&#xff0c;所以就直接使用了button&#xff0c;但是他本身带着边框&#xff0c;而且使用 border&#xff1a;none&#xff1b;是没有效果的。 问题图片 解决方案 button::after {border: none;} 正确样式 此时的分享…