(二十三)Collecttion集合

news2024/11/25 19:55:41

目录

        前言:

        ①Collecttion集合的体系结构

        ②Collecttion集合的遍历方式

        方式一:迭代器

        方式二:foreach/增强for循环

        方式三:Lambda表达式

        ③常见数据结构


前言:

        Collection: 是所有集合的顶级接口,里面规定了集合操作元素的相关功能方法集合与数组一样,用于存储一组元素,但是集合又多个不同的实现类来实现不同的数据结构

1.概述:

        集合和数组都是容器。

        集合是java中存储对象数据的一种容器。

2.数组和集合的元素存储的个数问题?

        数组定义后,类型确定、长度固定。

        集合的大小不固定,类型也可以选择不固定。

3.数组和集合的元素存储元素的类型问题?

        数组可以存储基本数据类型和引用数据类型的数据

        集合只能存储引用数据类型的数据

4.数组和集合适合的场景?

        数组适合做数据个数和类型确定的场景;

        数据的个数不确定,且要做增删元素的时候。

①Collecttion集合的体系结构

1.Collecttion集合的体系结构:

 

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

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

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

 

2.Collecttion集合特点:

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

                ArrayList、LinkedList:有序、可重复、有索引。

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

                HashSet:无序、不重复、无索引。

                LinkedHashSet:有序、不重复、无索引。

                TreeSet:按照大小默认升序排序、不重复、无索引。

3.代码演示:

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
​
/**
 * Collection  单列集合(祖宗接口)  每个数据只包含一个值
 * 1、list:  (Arraylist  Linkedlist)有序、可重复、有索引
 * 2、Set:  (HashSet   TreeSet有序   LinkedHashSet 按照大小默认升序排序)无序、不重复、无索引
 * Map  双列集合  每个数据包含两个值
 */
/**单列集合API
 * add()  添加元素
 * clear()  清空元素
 * isEmpty()  判断集合是否为空,是则返回true
 * size()  获取集合的大小
 * contains("")  判断集合是否包含某个元素
 * remove("")  删除某个元素值:如果有多个重复元素,默认删除前面的第一个
 * object[] arrs = c.toArray()   把集合转换成数组
 * 扩展 :
 * c1.addAll(c2)  把c2的集合元素传给c1(c2不会删去元素)
 */
public class Collection_Demo1 {
    public static void main(String[] args) {
        //有序、可重复、有索引
        Collection list = new ArrayList<>();//多态
        list.add("JAVA");
        list.add("JAVA");
        list.add(23);
        list.add(23);
        list.add(false);
        list.add(false);
        System.out.println(list);
        System.out.println("=========================");
        //无序、不重复、无索引
        Collection list1 = new HashSet();//多态
        list1.add("JAVA");
        list1.add("JAVA");
        list1.add(23);
        list1.add(23);
        list1.add(false);
        list1.add(false);
        System.out.println(list1);
 System.out.println("=========================");
        Collection <String>list2 = new ArrayList<>();
        list2.add("JAVA");
        list.addAll(list1);
    }
}

4.集合对于泛型的支持

        集合都是支持泛型的,可以在编译阶段约束集合只能操作某种数据类型。

 

5.注意:

        集合和泛型都只能支持引用数据类型,不支持基本数据类型,所以集合中存储的元素都认为是对象。

6.Collecttion集合常用API

 

7.代码演示:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
/**单列集合API
 * add()  添加元素
 * clear()  清空元素
 * isEmpty()  判断集合是否为空,是则返回true
 * size()  获取集合的大小
 * contains("")  判断集合是否包含某个元素
 * remove("")  删除某个元素值:如果有多个重复元素,默认删除前面的第一个
 * object[] arrs = c.toArray()   把集合转换成数组
 * 扩展 :
 * c1.addAll(c2)  把c2的集合元素传给c1(c2不会删去元素)
 */
public class Collection_Demo3 {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        //1.添加元素,成功返回true
        c.add("JAVA");
        c.add("Python");
        c.add("HTML");
        System.out.println(c);
        //2.清空集合的元素
        c.clear();
        System.out.println(c);
        //3.判断集合是否为空,是则返回true
        System.out.println(c.isEmpty());
        //4.获取集合的大小
        System.out.println(c.size());
        //5.判断集合是否包含某个元素
        System.out.println(c.contains("JAVA"));
        System.out.println(c.contains("Python"));
        System.out.println(c.contains("Html"));
        //6.删除某个元素值:如果有多个重复元素,默认删除前面的第一个
        System.out.println(c.remove("JAVA"));
        System.out.println(c);
        //7.把集合转换成数组
        Object[] arrs = c.toArray();
        System.out.println("数组: "+ Arrays.toString(arrs));
​
        System.out.println("========扩展========");
        Collection<String> c1 = new ArrayList<>();
        c1.add("java1");
        c1.add("java2");
        Collection<String> c2 = new ArrayList<>();
        c2.add("AK47");
        c2.add("58同城");
        //把c2的集合元素传给c1(c2不会删去元素)
        c1.addAll(c2);
        System.out.println(c1);
        System.out.println(c2);
    }
}

②Collecttion集合的遍历方式

方式一:迭代器

1.迭代器的遍历概述:

        ①遍历就是一个一个的把容器中的元素访问一遍。

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

2.Collecttion集合获取迭代器

 

3.Iterator中的常用方法

 

4.代码演示:

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
​
/**迭代器(Iterator)  是集合的专用迭代器
 * Iterator<E> iterator()  得到迭代器对象,默认值向当前集合的索引0
 * 迭代器取元素越界会报异常
 */
public class Iterator_Demo4 {
    public static void main(String[] args) {
        Collection<String> lists = new ArrayList<>();//多态
        lists.add("JAVA");
        lists.add("python");
        lists.add("html");
        System.out.println(lists);
​
        //1、得到当前集合的迭代器
        Iterator<String> it = lists.iterator();
        //一次只能取出一个元素  取元素不要越界
        String ele = it.next();
        System.out.println(ele);
        System.out.println(it.next());
        System.out.println("==================================");
        //2、定义while循环  取出全部元素
        while (it.hasNext()){
            String eles = it.next();
            System.out.println(eles);
        }
    }
}

方式二:foreach/增强for循环

1.概述:

        ①增强for循环既可以遍历数组也可以遍历集合。

        ②它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法。

        ③实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了Iterable接口。

2.增强for循环的遍历格式:

 

3.代码演示:

import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
​
/**增强for循环  既可以遍历数组也可以遍历集合
 * 内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法
 * 实现Iterable接口的类才可以使用迭代器和增强for循环  Collection实现了Iterable接口
 *  for(元素数据类型  变量名  :数组或Collection集合){ 在此处使用变量 }
 */
​
public class Demo {
    public static void main(String[] args) {
        //举例:增强for循环  遍历
        Collection<String> list = new ArrayList<>();
        list.add("JAVA");
        list.add("python");
        list.add("html");
        for (String ele: list){
            System.out.println(ele);
        }
        System.out.println("============================");
        double[] score = {100,99,23,14,56,14};
        for (double sc : score) {
            System.out.println(sc);
//            if (sc == 100) {
//                sc = 102;//修改无意义,不会影响数组的元素值
//            }
        }
        System.out.println("======================");
        //Lambda 遍历方式
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        System.out.println("=====================");
        //简便遍历方法
        list.forEach(System.out::println);
    }
}

方式三:Lambda表达式

1.Lambda表达式遍历集合

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

2.Collection结合Lambda遍历的API

 

例如:

 

3.代码演示:

/**Lambda  遍历方式
 *
 */
public class Demo {
    public static void main(String[] args) {
        //举例:增强for循环  遍历
        Collection<String> list = new ArrayList<>();
        list.add("JAVA");
        list.add("python");
        list.add("html");
        for (String ele: list){
            System.out.println(ele);
        }
        System.out.println("============================");
        double[] score = {100,99,23,14,56,14};
        for (double sc : score) {
            System.out.println(sc);
//            if (sc == 100) {
//                sc = 102;//修改无意义,不会影响数组的元素值
//            }
        }
        System.out.println("======================");
        //Lambda 遍历方式
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        System.out.println("=====================");
        //简便遍历方法
        list.forEach(System.out::println);
    }
}

4.案例:影片信息在程序中的表示

需求:

        某电影院需要在后台存储上述三部电影,然后依次展示出来。

分析:

        ①定义一个电影类,定义一个集合存储电影对象;

        ②创建3个电影对象,封装相关数据,把3个对象存入到集合中去。

        ③遍历集合中的3个对象,输出相关信息。

电影类:

public class Movie {
    private String name;
    private  double score;
    private String actor;
​
    public Movie(){
​
    }
    public Movie(String name, double score , String actor) {
        this.name = name;
        this.score = score;
        this.actor = actor;
    }
​
    public double getScore() {
        return score;
    }
​
    public void setScore(double score) {
        this.score = score;
    }
​
    public String getActor() {
        return actor;
    }
​
    public void setActor(String actor) {
        this.actor = actor;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
}

实现类:

import java.util.ArrayList;
​
public class Test {
    public static void main(String[] args) {
        //1定义电影类
        //2.创建三个电影类
        Movie m1 = new Movie("《肖申克的救赎》",9.7,"罗宾斯");
        Movie m2 = new Movie("《霸王别姬》",9.7,"张国荣");
        Movie m3 = new Movie("《阿甘正传》",9.5,"张丰毅");
        //3.创建一个电影类型ArrayList集合,存储三部电影
        ArrayList<Movie> movies = new ArrayList<>();
        movies.add(m1);
        movies.add(m2);
        movies.add(m3);
        //4.遍历电影类型的集合中的每个电影对象,访问它的信息即可
        for (int i = 0; i < movies.size(); i++) {
            Movie m = movies.get(i);
            System.out.println("电影名称:"+m.getName());
            System.out.println("电影得分:"+m.getScore());
            System.out.println("电影导演:"+m.getActor());
            System.out.println("-----------------------------");
        }
    }
}

5.集合中存储的元素是什么信息?

        集合中存储的是元素对象的地址。

③常见数据结构

1.数据结构的概述:

        数据结构是计算机底层存储、组织数据的方式。是指数据之间是以什么方式排列在一起的。

        通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。

2.常见的数据结构:

                栈

                队列

                数组

                链表

                二叉树

                二叉查找树

                平衡二叉树

                红黑树

                ......

3.栈数据结构的执行特点:

        后进先出,先进后出

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

4.常见数据结构之队列

        先进先出,后进后出

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

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

5.常见数据结构之数组

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

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

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

6.链表的特点

        ①链表中的元素是在内存中不连续存储的,每个元素节点包含数据值和下一个元素的地址。

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

        ③链表增删相对快。

7.链表的种类

单向链表:

 

双向链表:

 

8.二叉树、二叉查找树

        ①普通二叉树概述:

                只能有一个根节点,每个节点最多支持2个直接子节点;

                结点的度:节点拥有的子树的个数,二叉树的度不大于2,叶子节点度为0的节点,也称为终端节点;

                高度:叶子节点的高度为1,则子节点的父节点高度为2,以此类推,根节点的高度最高;

                层:根节点在第一层,以此类推;

                兄弟节点:拥有共同父节点的节点互称为兄弟节点。

②二叉查找树又称为二叉排序树或者二叉搜索树

        特点:

                1.每一个节点上最多有两个子节点;

                2.左子树上所有节点的值都小于根节点的值;

                3.右子树上所有节点的值都大于根节点的值;

        目的:提高检索数据的性能。

9.平衡二叉树

        平衡二叉树 是在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。

10.平衡二叉树的要求

        任意节点的左右两个子树的高度差不超过1,任意节点的左右两个子树都是一颗平衡二叉树。

        平衡二叉树在添加元素后可能导致不平衡,基本策略是进行左旋,或者右旋保证平衡。

11.红黑树

        红黑树增删改查的性能都很好。

        概述:

                红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构。

                1972年出现,当时被称为平衡二叉B树,1978年被修改为“红黑树”。

                每一个节点可以是红或者黑;红黑树不是通过高度平衡的,它的平衡是通过“红黑规则”进行实现的。

12.红黑规则

                每一个节点或是红色的,或是黑色的,根节点必须是黑色的;

                如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,叶节点是黑色的;

                如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况);

                对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点;

13.添加节点

                添加节点的颜色,可以是红色的,也可以是黑色的。

                默认用红色效率高。

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

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

相关文章

使用Sa-token实现单点登录

使用Sa-token实现单点登录单点登录需求为何选择Sa-Token简单使用sa-token接口如何保持登录态使用拦截器实现鉴权聊聊Sa-Token的理解聊聊遇到的一些问题单点登录需求 其实一直想写一个单点登录系统&#xff0c;现在的现状是公司内部有非常多项目的&#xff0c;然后每个项目一套登…

数据分析面试题--数理知识点1

目录标题1&#xff0c;python统计一段话每个单词出现的次数2&#xff0c;SQL中如何利用replace函数统计给定重复字段在字符串中的出现频率&#xff1f;3&#xff0c;常见的统计分析方法有哪些&#xff1f;拿到数据如何分析4&#xff0c;参数估计和假设检验的联系和区别5&#x…

网络实验之OSPF路由协议(一)

一、OSPF路由协议简介 开放式最短路径优先&#xff08;Open Shortest Path First&#xff0c;OSPF&#xff09;路由协议是用于网际协议&#xff08;IP&#xff09;网络的链路状态路由协议。该协议使用链路状态路由算法的内部网关协议&#xff08;IGP&#xff09;&#xff0c;在…

NIO笔记

一. NIO 基础 non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c;可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c;而之前的 st…

SAP ABAP 代码修改自动比较对象版本一致

第一步&#xff0c;找到SE38/SE37代码修改的出口 SMOD中查找 第二步&#xff0c;实施增强 CMOD中添加增强并激活&#xff0c;如下图 第三步&#xff0c;添加代码 如上图两个双击添加并修改代码 ZXSEUU08中与 ZXSEUU01代码一致&#xff0c;如下 *&----------------------…

【年度总结】我的2022年-职业生涯大转折

【年度总结】我的2022年-职业生涯大转折2022总结大厂的苦与乐找工作的焦虑再起启航2023展望持续刷题持续学习捡起博客在漩涡中疯狂挣扎的一年 2022总结 大厂的苦与乐 上半年主要在搞中台&#xff0c;需要对接的其他团队比较多&#xff0c;每天都在对接需求、优化需求。同时还…

Python NumPy 创建数组(ndarray)

前言NumPy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python科学计算库。使用NumPy&#xff0c;就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数&#xff0c;涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍使用Python NumPy 创建…

鉴源论坛 · 观辙丨基于机器学习的汽车CAN总线异常检测方法

作者 | 张渊策 上海控安可信软件创新研究院研发工程师 来源 | 鉴源实验室 目前机器学习是研究车辆网络入侵检测技术的热门方向&#xff0c;通过引入机器学习算法来识别车载总线上的网络报文&#xff0c;可实现对车辆已知/未知威胁的入侵检测。这种基于机器学习的异常检测技术普…

chrono_duration(一)

文章目录chrono简介std::chrono::durationduratio基本介绍基本概念使用引入std::ratio 参数深入特化的duratio改造之前的代码静态成员函数 count原型例子构造函数支持加减乘除运算编译细节支持比较运算符查询范围类型转换例子引入修改seconds的范围浮点类型系统特化的duratio自…

os模块的使用方法详解

os模块os模块负责程序与操作系统的交互&#xff0c;提供了访问操作系统底层的接口&#xff1b;即os模块提供了非常丰富的方法用来处理文件和目录。使用的时候需要导入该模块&#xff1a;import os常用方法如下&#xff1a;方法名作用os.remove(‘path/filename’)删除文件os.re…

Unidbg模拟执行某段子so实操教程(一) 先把框架搭起来

一、目标 最近又开始研究Unidbg了&#xff0c;费了好大劲&#xff0c;没有跑起来。今天就先找个软柿子捏捏看。 今天的目标是 之前研究的 某段子App签名计算方法(一) 某段子App版本 5.5.10 二、步骤 先搭起框架来 在 /unidbg/unidbg-android/src/test/java/ 下面新建一个 …

K8S 三种探针ReadinessProbe、LivenessProbe和StartupProbe 之探索

一、事件背景因为k8s中采用大量的异步机制&#xff0c;以及多种对象关系设计上的解耦&#xff0c;当应用实例数增加/删除、或者应用版本发生变化触发滚动升级时&#xff0c;系统并不能保证应用相关的service、ingress配置总是及时能完成刷新。在一些情况下&#xff0c;往往只是…

Python爬虫之Scrapy框架系列(4)——项目实战【某瓣Top250电影更多信息的获取】

前言&#xff1a; 上篇文章使用Scrapy框架简单爬取并下载了某瓣Top250首页的排名前25个电影的电影名。 太寒酸了&#xff0c;这篇文章咱就来仔细搞一搞&#xff0c;搞到更加详细的信息&#xff01;&#xff01;&#xff01; 目录&#xff1a;1.分析2.使用scrapy shell提取电影详…

进程信号--Linux

文章目录信号&#xff1f;kill -l 指令查看所有信号信号的工作流程信号产生1.通过终端按键产生信号2.通过系统调用接口产生信号3.通过软件产生信号4.硬件异常产生信号信号接收信号处理总结信号&#xff1f; 进程间的通信我们了解到有管道通信&#xff0c;有共享内存的通信。这…

flowable编译

git clone -b flowable-release-6.7.2 https://github.com/flowable/flowable-engine.git下载之后File-Open&#xff0c;打开工程&#xff0c;modules是核心代码模块 找到flowable-root.xml按下altf12 &#xff0c;启动Terminal终端输入命令&#xff1a;mvn clean package -Ds…

《Buildozer打包实战指南》第三节 安装Buildozer打包所需的依赖文件

目录 3.1 安装依赖软件包 3.2 安装Cython 3.3 设置环境变量 3.4 安装p4a、Android SDK、NDK以及其他编译文件 Buidozer这个打包库下载安装完毕之后&#xff0c;我们还需要下载一些打包安卓apk所需要的依赖文件。 3.1 安装依赖软件包 首先输入以下命令更新Ubuntu上的软件包…

使众人行:如何带领一群人把事做成?

你好&#xff0c;我是雷蓓蓓&#xff0c;一名程序员出身的项目经理&#xff0c;曾任网易杭研项目管理部总监。 我所带领的网易杭研项目管理部&#xff0c;从2011年成立以来&#xff0c;就一直在互联网项目管理领域深耕&#xff0c;为网易云音乐、网易严选、云计算、智慧企业等…

智慧社区管理系统改造方案

伴随着城市发展的持续加速&#xff0c;许多在建智慧社区和老旧小区智能化改造都在有规划的展开着。如今许多老旧小区在展开设备升级&#xff0c;许多小区智能安防设备、物业管理服务系统软件、社区综合服务平台及其监控器设备等都会展开智能化改造。但是&#xff0c;很多人对老…

17.优于select的epoll

优于select的epoll epoll 理解及应用 select复用方法其实由来已久&#xff0c;因此&#xff0c;利用该技术后&#xff0c;无论如何优化程序性能也无法同时接入上百个客户端&#xff08;当然&#xff0c;硬件性能不同&#xff0c;差别也很大&#xff09;。这种select方式并不适…

IIC驱动中景园0.96寸OLED

驱动硬件介绍 1、驱动电压3.3到5,但是正点的也是这个芯片说用3.3 5会烧坏掉。 2、RST 上的低电平,将导致OLED 复位,在每次初始化之前,都应该复位一下 OLED 模块。而我们使用四线,里面就没有复位了 3、裸屏有多种接口方式(驱动芯片为SSD1306) 6800、8080 两种并行接口方…