集合的进阶学习

news2024/11/26 14:41:40

集合体系结构

Collection 单列集合

包含List Set

List 包含ArrayList LinkedList

Set包含HashSet TreeSet

HashSet包含LinkedHashSet

List系列集合:添加的元素是有序的、可重复、有索引

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

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

    public static void main(String[] args) {

        //Collection是一个接口,我们不能直接创建它的对象
        Collection<String> coll=new ArrayList<>();

        //1.添加元素
        /*
        细节1.如果王List里添加元素,方法总是返回true 因为List允许元素重复
        细节2.如果往Set李添加元素,不存在返回true,存在返回false
        Set系列集合不允许重复
        * */
        coll.add("aaa");
        coll.add("bbb");
        coll.add("ccc");
        coll.add("ddd");
        System.out.println(coll);

        //2.清空
//        coll.clear();
//        System.out.println(coll);

        //3.删除
        //因为Collection里面定义的方法是共性的方法,所以不能通过索引进行删除,智能通过元素的对象进行删除
        /*
        方法会有一个布尔类型的返回值,true删除成功,false失败
        * */
        coll.remove("aaa");
        System.out.println(coll);

        //4.判断元素是否包含
        //底层是依赖equals方法进行判断是否存在的
        //所以要判断自定义对象是否存在时候,要重新equals方法
        System.out.println(coll.contains("bbb"));
        
        //5.判空
        boolean empty = coll.isEmpty();
        System.out.println(empty);
        
        //6.获取集合的长度
        int size = coll.size();
        System.out.println(size);
    }

Collection的遍历方式

迭代器遍历

特点:迭代器不依赖索引

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

Collection<Integer> collection= new ArrayList<>();
collection.add(1);
collection.add(2);
collection.add(3);
Iterator<Integer> it=collection.iterator();
while (it.hasNext()){
    int i=it.next();
    System.out.print(i+"  ");
}

细节注意:

1.报错NoSuchElementException

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

3.循环中只能用一次next方法

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

增强for遍历

增强for的底层就是迭代器,为了简化迭代器的代码书写的

所有的单列集合和数组才能用增强for遍历

格式:

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

}

for(String s : list){

}

public static void main(String[] args) {
    Collection<String> coll = new ArrayList<>();
    coll.add("zhangsan");
    coll.add("lisi");
    coll.add("wangwu");
    for (String s : coll) {
        System.out.println(s);
    }
}

细节:

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

Lambda表达式遍历

    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<>();
        coll.add("zhangsan");
        coll.add("lisi");
        coll.add("wangwu");

        
  /*      coll.forEach(new Consumer<String>() {
            @Override
            //s 是以此表示集合的每一个数据
            public void accept(String s) {
                System.out.println(s);
            }
        });*/

        coll.forEach(s -> System.out.println(s));
    }
}

List中常见的方法和遍历方式

//List集合中的两个删除的方法
//1.直接删除元素
//2.通过素银进行删除

//1.创建集合并添加元素
//1.创建一个集合
List<String> list =new ArrayList<>();

//2.添加元素
list.add("a");
list.add("b");
list.add("c");

//void add(int index,E element);在指定索引位置添加指定的元素
//细节:
/*
原来索引上的元素会依次往后移
* */
list.add(1,"QQQ");

//remove
String remove = list.remove(0);
System.out.println(remove);

//set
String  aaa = list.set(0, "aaa");
System.out.println(aaa);

//get
String s = list.get(0);
System.out.println(s);

//3.打印集合
System.out.println(list);

List集合的五种遍历方式

        //创建集合
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        list.add("eee");

       /* //1.迭代器遍历
        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }*/

        //2.增强for
    /*    for (String str : list) {
            System.out.println(str);
        }*/

        //3.Lambda表达式
/*        list.forEach(s-> System.out.println(s));*/

        //4.普通for
  /*      for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            System.out.println(s);
        }*/

        //5.列表迭代器
        //获取一个列表迭代器对象,同样的里面的指针也是指向零索引
        ListIterator<String> it = list.listIterator();
        while (it.hasNext()){
            String next = it.next();
            if ("bbb".equals(next)){
                it.add("qqq");
            }
            System.out.println(next);
        }
        System.out.println(list);

遍历方式比较

迭代器遍历:在遍历的过程中需要删元素,请使用迭代器

列表迭代器:在遍历的时候需要添加元素,请使用列表迭代器

增强for,Lambda:仅仅想遍历

普通for:如果遍历的时候想操作索引

Set系列集合

无序:存取顺序不一致

不重复:可以去除重复

无索引:没有带索引的方法,所以不能使用普通for遍历,也不能通过索引获取元素

Set集合的实现类

HashSet:无序,不重复,无索引

LinkedHashSet:有序,不重复,无索引

TreeSet:可排序,不重复,无索引

        //1.创建Set集合对象
        Set<String> s = new HashSet<>();

        //2.添加元素
        s.add("aaa");
        s.add("bbb");
        s.add("ccc");
        s.add("ddd");
//        s.add("aaa");

        3.遍历
        //迭代器遍历
        Iterator<String> iterator = s.iterator();
        while (iterator.hasNext()) {
            String next = iterator.next();
            System.out.println(next);
        }

        //增强for
        for (String s1 : s) {
            System.out.println(s1);
        }

        //Lambda表达式
        s.forEach(a -> System.out.println(a));

HshSet底层采取哈希表存储数据

TreeSet集合默认的规则:对于字符、字符串类型,按照ASCII码表中的顺序进行排序

TreeSet的两种排序方式

1.自然排序

类里面实现Comparable接口里面的方法

@Override
public int compareTo(Student o) {
    //指定排序的规则
    //按照年龄的升序进行排序
    return    this.getAge()-o.getAge();

}

2.比较器排序

TreeSet<String> ts = new TreeSet<>((o1, o2) -> {
    int i = o1.length() - o2.length();
    i = i == 0 ? o1.compareTo(o2) : i;
    return i;
});
TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
    @Override
    public int compare(String o1, String o2) {
        int i = o1.length() - o2.length();
        i = i == 0 ? o1.compareTo(o2) : i;
        return i;
    }
});

使用场景

1.如果想要集合中的元素可重复

用ArrayList基于数组的

2.如果想要集合中的元素可重复,而且当前的增删操作明显多于查询

用LinkedList,基于链表的

3.如果想对集合中的元素去重

用HashSet,基于哈希表的

4.如果想对集合中的元素去重,而且保重存取顺序

用LinkedHashList,基于哈希表和双链表,效率低于HashSet

5.如果想对集合中的元素进行排序

用TreeSet,基于红黑树,后续可以用List集合实现排序

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

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

相关文章

华为云云服务器评测|在Docker环境下部署Mysql数据库

华为云云服务器评测&#xff5c;在Docker环境下部署Mysql数据库 一、前言1.1 云耀云服务器L实例简介1.2 Mysql数据库简介 二、本次实践介绍2.1 本次实践简介2.2 本次环境规划 三、购买云耀云服务器L实例3.1 登录华为云3.2 购买云耀云服务器L实例3.3 查看云耀云服务器L实例状态3…

Windows wsl2安装Ubuntu

wsl&#xff08;Windows Subsystem for Linux&#xff09;即适用于Windows的Linux子系统&#xff0c;是一个实现在Windows 10 / 11上运行原生Linux的技术。 wsl2 为其迭代版本&#xff0c;可以更好的在Windows上运行Linux子系统。 这里以 Windows 11 安装Ubuntu作为示例。 开启…

浅识java多线程

目录 一 进程和线程定义 二 创建线程的种类 &#xff08;1&#xff09;继承java.lang.Thread &#xff08;2&#xff09;实现java.lang.Runnable接口 三 多线程 &#xff08;1&#xff09;继承java.lang.Thread多线程 &#xff08;2&#xff09;实现java.lang.Runnable…

vmware fusion12共享文件夹到虚拟机window10

文章目录 一、window10虚拟机安装VMware Tools二、MAC配置共享文件夹三、使用 一、window10虚拟机安装VMware Tools vmware fusion—虚拟机----安装VMware Tools–一路下一步 确认安装 双击进行安装 一路下一步&#xff0c;傻瓜式安装 二、MAC配置共享文件夹 设置—系…

2023年高教社杯全国大学生数学建模竞赛参赛事项注意

MathClub数模资源&#xff0c;含专属思路 资源链接&#xff1a;点击这里获取众多数模资料、思路精讲、论文模板latex和word、学习书籍等 2023高教社杯数学建模国赛–赛前准备 一年一度的数学建模国赛要来啦&#xff01;&#xff01;&#xff01;小编仔细阅读了比赛官方网站上…

【Java】线程都有哪几种状态

文章目录 前言传统线程模型&#xff08;操作系统&#xff09;中线程状态Java线程中的状态线程的运行流程 前言 首先我们要知道&#xff0c;在传统&#xff08;操作系统&#xff09;的线程模型中线程被分为五种状态&#xff0c;在java线程中&#xff0c;线程被分为六种状态。 …

使用客户支持自动化,您的电子商务收益稳了

经营电子商务业务涉及处理各种任务&#xff0c;从营销和库存管理到客户支持和数据分析。这些职责的复杂性可能是压倒性的&#xff0c;即使有一个专门的团队。 聊天机器人可以通过指导您的客户完成购买过程并回答他们有关产品的问题来提供更好的体验。例如SaleSmartly&#xff…

房地产推广传单制作攻略,打造让人惊艳的电子传单

随着互联网的发展&#xff0c;传统的纸质传单已经逐渐被电子版传单所取代。电子版传单不仅可以节省成本&#xff0c;还可以更好地展示房产信息。在传统的设计软件中制作电子版传单需要一定的门槛&#xff0c;但是现在有了乔拓云网的后台&#xff0c;设计电子版房产H5传单变得简…

Android——数据存储(二)(二十二)

1. SQLite数据库存储 1.1 知识点 &#xff08;1&#xff09;了解SQLite数据库的基本作用&#xff1b; &#xff08;2&#xff09;掌握数据库操作辅助类&#xff1a;SQLiteDatabase的使用&#xff1b; &#xff08;3&#xff09;可以使用命令操作SQLite数据库&#xff1b; …

RabbitMQ:hello结构

1.在Linux环境上面装入rabbitMQ doker-compose.yml version: "3.1" services:rabbitmq:image: daocloud.io/library/rabbitmq:managementrestart: alwayscontainer_name: rabbitmqports:- 6786:5672- 16786:15672volumes:- ./data:/var/lib/rabbitmq doker-compos…

Vue框架--Vue中的样式绑定

1.Vue绑定class样式属性(内部样式) 这里我们介绍三种Vue关于绑定class属性的操作。 ①.字符串写法:适用于:样式的类名不确定,需要动态指定 ②.数组写法:适用于:要绑定的样式个数不确定、名字也不确定 ③.对象写法:

vscode 调试debug rust代码的时候,中文乱码的解决办法

上次也是同样的问题&#xff0c;解决了。今天又遇到&#xff0c;我还以为是项目代码用了什么高深的地方&#xff0c;其实用chcp 65001&#xff0c;都可以解决。 一种解决方法是&#xff1a; 但建议不要用这种方法&#xff0c;因为会引起其他软件不能用&#xff08;或者出问题…

山西电力市场日前价格预测【2023-09-07】

日前价格预测 预测明日&#xff08;2023-09-07&#xff09;山西电力市场全天平均日前电价为331.72元/MWh。其中&#xff0c;最高日前电价为461.61元/MWh&#xff0c;预计出现在19: 30。最低日前电价为254.50元/MWh&#xff0c;预计出现在12: 45。 价差方向预测 1&#xff1a; 实…

stm32同芯片但不同flash工程更换Device出现报错

目录 1. 问题描述2. 解决方案 1. 问题描述 stm32同芯片但不同flash工程更换Device出现报错 2. 解决方案 更换Device&#xff0c;我是从ZE换为C8&#xff1a; 把这个从HD更换为MD 解决&#xff01;

3D点云处理:Opencv Pcl实现深度图转点云(附源码)

文章目录 0. 测试效果1. 代码实现文章目录:3D视觉个人学习目录微信:dhlddxB站: Non-Stop_0. 测试效果 处理结果1. 代码实现 文章中提供的深度图像,深度图像一般以.tiff和.png保存,可以通过Opencv中的

Echarts图表跟随父容器的变化自适应

如果页面中有多个图表 隐藏/展开左边侧边栏echarts图表自适应 <div class"line"><div class"title">制冷站关键参数</div><div id"chartLine1" style"width: 100%;height:85%;"></div></div><…

生成树STP中的概念

在数据结构中&#xff0c;有一个方法叫做最小生成树。有环的我们常称为图。将图中的环破了&#xff0c;就生成了树。在计算机网络中&#xff0c;生成树的算法叫作 STP&#xff0c;全称 Spanning Tree Protocol。 Root Bridge&#xff0c;也就是根交换机。这个比较容易理解&…

卖家福利!第三方物流兼容亚马逊日本站运输管理功能!

亚马逊日本站发布公告称外部解决方案提供商Redo Bong LLC提供的库存和运输管理应用程序 “maru9”中添加了与亚马逊 “Marketplace Shipping Service”兼容的运输管理功能&#xff0c;以下是公告内容&#xff1a; 外部解决方案提供商Redo B…

怎么解决期权手续贵的问题?

在开通50ETF期权交易权限之前&#xff0c;券商可能会要求您参加相关的培训或考试&#xff0c;以确保您了解ETF期权交易的基本概念和交易规则&#xff0c;特别是期权手续费的问题&#xff0c;在你开之前&#xff0c;需要咨询协商价格&#xff0c;符合你的心理预期再去开通&#…

【LeetCode算法系列题解】第61~65题

CONTENTS LeetCode 61. 旋转链表&#xff08;中等&#xff09;LeetCode 62. 不同路径&#xff08;中等&#xff09;LeetCode 63. 不同路径 II&#xff08;中等&#xff09;LeetCode 64. 最小路径和&#xff08;中等&#xff09;LeetCode 65. 有效数字&#xff08;困难&#xff…