Java集合概述(Collection集合)

news2024/11/15 4:19:13

目录

      • 集合
        • 一、集合与数组
        • 二、集合类体系结构
        • 三、泛型(约定集合存储数据类型)
        • 四、Collection集合常用API
        • 五、Collection集合的遍历方式
          • 5.1 迭代器遍历
          • 5.2 增强for循环(for each):
          • 5.3 lambda表达式
        • 六、Collection集合存储自定义类型的对象
        • 七、常见数据结构

集合

一、集合与数组

数组的特点:数组定义完成并启动后,类型确定、长度固定。

因此,在进行增删操作的时候,数组是不太合适的,可能需要放弃原有数组或者移位

弊端:

  • 不适合元素的个数和类型不确定的业务场景
  • 不适合做需要增删数据操作
  • 数组的功能也比较的单一,处理数据的能力并不是很强大

因此,引入了集合。

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

集合的特点:集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。

优势:

  • 集合非常适合元素个数不能确定,且需要做元素的增删操作的场景。
  • 同时,集合提供的种类特别的丰富,功能也是非常强大的,开发中集合用的更多。

总结:

  1. 数组和集合的元素存储的个数问题。
    • 数组定义后类型确定,长度固定
    • 集合类型可以不固定,大小是可变的。
  2. 数组和集合存储元素的类型问题。
    • 数组可以存储基本类型和引用类型的数据。
    • 集合只能存储引用数据类型的数据。
  3. 数组和集合适合的场景
    • 数组适合做数据个数和类型确定的场景。
    • 集合适合做数据个数不确定,且要做增删元素的场景,集合种类更多,功能更强大。

二、集合类体系结构

集合:

  • Collection单列集合,每个元素(数据)只包含一个值。
  • Map双列集合,每个元素包含两个值(键值对)。

在这里插入图片描述

Collection集合特点

  • List系列集合:添加的元素是有序、可重复、有索引。
    • ArrayList、LinekdList :有序、可重复、有索引。
  • Set系列集合:添加的元素是无序、不重复、无索引。
    • HashSet: 无序、不重复、无索引
    • LinkedHashSet: 有序、不重复、无索引。
    • TreeSet:按照大小默认升序排序、不重复、无索引。
public class CollectionDemo1 {
    public static void main(String[] args) {
        //有序 可重复 有索引
        Collection list=new ArrayList<>();
        list.add("Java");
        list.add("Java");
        list.add("Mybatis");
        list.add(12);
        list.add(12);
        list.add(false);
        list.add(false);
        System.out.println(list);//[Java, Java, Mybatis, 12, 12, false, false]

        //无序 不重复 无索引
        Collection list1=new HashSet();
        list1.add("Java");
        list1.add("Java");
        list1.add("Mybatis");
        list1.add(12);
        list1.add(12);
        list1.add(false);
        list1.add(false);
        System.out.println(list1);//[Java, false, 12, Mybatis]

    }
}

三、泛型(约定集合存储数据类型)

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

Collection<String> lists = new ArrayList<String>();
Collection<String> lists = new ArrayList<>(); // JDK 7开始后面的泛型类型申明可以省略不写

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

//Collection<int> lists = new ArrayList<>(); 错误写法

如果集合中要存储基本类型的数据怎么办?

// 存储基本类型使用包装类
Collection<Integer> lists1 = new ArrayList<>();
Collection<Double> lists2 = new ArrayList<>();

四、Collection集合常用API

Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
在这里插入图片描述

五、Collection集合的遍历方式

方式一:迭代器
方式二:foreach/增强for循环
方式三:lambda表达式

5.1 迭代器遍历

迭代器遍历概述

  • 遍历就是一个一个的把容器中的元素访问一遍。
  • 迭代器在Java中的代表是Iterator,迭代器是集合的专用的遍历方式
public static void main(String[] args) {
        Collection<String> list=new ArrayList<>();
        list.add("String1");
        list.add("String2");
        list.add("String3");
        list.add("String4");
        System.out.println(list);//[String1, String2, String3, String4]

        //1.得到当前集合的迭代器对象
        Iterator<String> i= list.iterator();
        //2.定义while循环
        while (i.hasNext()){
            String element=i.next();
            System.out.println(element);
        }

    }
  • Collection集合获取迭代器
    • Iterator iterator():返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引
  • Iterator中的常用方法
    • boolean hasNext():询问当前位置是否有元素存在,存在返回true ,不存在返回false
    • E next():获取当前位置的元素,并同时将迭代器对象移向下一个位置,注意防止取出越界

迭代器如果取元素越界会出现什么问题

会出现NoSuchElementException异常

5.2 增强for循环(for each):

既可以遍历集合也可以遍历数组。
它是JDK5之后出现的,其内部原理是一个lterator迭代器,遍历集合相当于是迭代器的简化写法。
实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现了lterable接口。

格式:

for(元素数据类型 变量名 : 数组或者Collection集合) {
         //在此处使用变量即可,该变量就是元素
}

例子

public static void main(String[] args) {
        Collection<String> list=new ArrayList<>();
        list.add("String1");
        list.add("String2");
        list.add("String3");
        list.add("String4");
        System.out.println(list);//[String1, String2, String3, String4]
        
        //foreach 进行遍历
        for (String element:list) {
            System.out.println(element);
        }        
    }
5.3 lambda表达式

Collection结合Lambda遍历的API:
default void forEach(Consumer<? super T> action): 结合lambda遍历集合

    public static void main(String[] args) {
        Collection<String> list=new ArrayList<>();
        list.add("String1");
        list.add("String2");
        list.add("String3");
        list.add("String4");
        System.out.println(list);//[String1, String2, String3, String4]

        //forEach 内部类
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        });
        //ForEach lambda表达式
        list.forEach((String s)->{System.out.println(s);});

        //ForEach lambda表达式简化
        list.forEach(s->System.out.println(s));
    }

ForEach方法的底层代码:通过增强for实现

default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

六、Collection集合存储自定义类型的对象

案列需求:某影院系统需要在后台存储上述三部电影,然后依次展示出来
分析

  1. 定义一个电影类
public class Movie {
    private String name;
    private double score;
    private String actor;
    public Movie(String name, double score, String actor) {
        this.name = name;
        this.score = score;
        this.actor = actor;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    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;
    }
}
  1. 定义一个集合存储电影对象。
  2. 创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
  3. 遍历集合中的3个对象,输出相关信息。
public class TestDemo {
    public static void main(String[] args) {
        //定义一个集合存储电影对象。
        Collection<Movie> movies=new ArrayList<>();
        //创建3个电影对象,封装相关数据,把3个对象存入到集合中去。
        movies.add(new Movie("《肖生克的救赎》", 9.7 ,  "罗宾斯"));
        movies.add(new Movie("《霸王别姬》", 9.6 ,  "张国荣、张丰毅"));
        movies.add(new Movie("《阿甘正传》", 9.5 ,  "汤姆.汉克斯"));
        //遍历集合中的3个对象,输出相关信息。
        for (Movie m:movies) {
            System.out.println("片名"+m.getName());
            System.out.println("评分"+m.getScore());
            System.out.println("导演"+m.getActor());
        }
    }
}

在这里插入图片描述

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

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

七、常见数据结构

  • 队列:先进先出,后进后出。
  • 栈:后进先出,先进后出。
  • 数组:内存连续区域,查询快,增删慢。
  • 链表:元素是游离的,查询慢,首尾操作极快。
  • 二叉树:永远只有一个根节点, 每个结点不超过2个子节点的树。
  • 查找二叉树:小的左边,大的右边,但是可能树很高,查询性能变差。
  • 平衡查找二叉树:让树的高度差不大于1,增删改查都提高了。
  • 红黑树(就是基于红黑规则实现了自平衡的排序二叉树)

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

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

相关文章

【设计模式】9.桥接模式

概述 现在有一个需求&#xff0c;需要创建不同的图形&#xff0c;并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系&#xff1a; 我们可以发现有很多的类&#xff0c;假如我们再增加一个形状或再增加一种颜色&#xff0c;就需要创建更多的类。 试…

redis 05 篇——主从复制

redis 05 篇——主从复制1. 前言1.1 什么是复制&#xff1f;1.1.1 复制概述1.1.2 主从复制的架构1.2 为什么要使用主从复制&#xff1f;1.3 主从复制主要的命令配置2. 准备工作3. 核心配置3.1 主服务器3.2 从服务器4. 实例演示4.1 简单实例——两台服务器4.1.1 同一服务多个red…

小程序:使用分包异步化解决一个分包引入另一个分包的组件/函数的问题

背景 我们一般使用小程序插件的时候&#xff0c;喜欢将其放在分包中&#xff0c;因为插件体积会打包进主包内&#xff0c;很容易造成主包体积超过 2M 从而无法发布&#xff0c;我们暂且叫这个有插件的分包叫分包P&#xff0c;这时候另外两个业务分包XY&#xff0c;想引入这个分…

从Java培训班出来好找工作吗?

个人觉得这个问题要从两方面来看&#xff0c;首先是培训班的Java课程质量如何&#xff0c;是否贴合用人单位实际需求&#xff0c;学出来的技术能对口&#xff1b;其次是培训班是否保障就业&#xff0c;有就业机会渠道推荐&#xff0c;比如老学员内推、合作企业人才输送以及企业…

【Spring Cloud Alibaba】008-Sentinel

【Spring Cloud Alibaba】008-Sentinel 文章目录【Spring Cloud Alibaba】008-Sentinel一、服务雪崩1、概述2、解决方案常见的容错机制二、Sentinel&#xff1a;分布式系统的流量防卫兵1、**Sentinel** 概述简介特性Sentinel 的开源生态Sentinel 的历史2、Sentinel 基本概念资源…

低代码系统能够解决哪些痛点?

低代码系统能够解决哪些痛点&#xff1f;如果用4句话去归纳&#xff0c;低代码开发可以解决以下问题—— 为企业提供更高的灵活性&#xff0c;用户可以突破代码的限制自主开发业务应用&#xff1b;通过减少对专业软件开发人员的依赖&#xff0c;公司可以快速响应市场上的新业务…

cartographer中分支定界法理解——为什么能保证上界

定界原理 储存的不同分辨率栅格图&#xff0c;为保证上边界正确性&#xff0c;即高层中的评分一定高于其底层节点的评分&#xff0c;压缩的地图并非直接从原图固定间隔采样&#xff0c;而是将固定间隔中所有坐标概率值最大值作为低分辨率地图。 理解&#xff1a; 1、其在计算…

ESP32中MQTT通讯

MQTT文档介绍 一、在PC上可以使用 MQTT X 工具&#xff1a;&#xff08;参考地址&#xff09; 1、客户端下载&#xff1a;MQTT X 工具下载地址 2、EMQX服务器下载地址 3.打开命令行工具&#xff0c;进入目录运行EMQX服务。 电脑左下角&#xff0c;右键开始->运行->输…

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建

我国二氧化碳地质封存技术起步较晚&#xff0c;目前仍没有一套相对完整的行业规范&#xff1b;且就该技术而言&#xff0c;涉及环节众多&#xff0c;理论相对复杂&#xff0c;对于行业的新入局者不太友好。因此&#xff0c;结合时代背景&#xff0c;我们首次尝试对二氧化碳地质…

升级多语言,应用国际化_三叠云

国际化配置 路径 表单设计 >> 字段属性 功能简介 【字段】新增 「国际化配置」 这是一个和国际化配合的功能&#xff0c;可以在用户通过切换不同的语言环境时&#xff0c;表单的标题、提示语等将会根据相应的语言环境切换到相应的表单字段标题、提示语&#xff0c;使…

Eureka注册中心-Ribbon负载均衡

1、Eureka注册中心服务注册与发现提供了一个服务注册中心、服务发现的客户端&#xff0c;还有一个方便查看所有注册的服务的界面。所有的服务使用Eureka的服务发现客户端来将自己注册到Eureka的服务器上。1.1 、Eureka的结构和作用1.1.1、Eureka的作用1.1.2、获取地址信息的流程…

【C++进阶】三、二叉搜索树

目录 一、二叉搜索树 1.1 概念 1.2 二叉搜索树操作 二、二叉搜索树实现 2.1 框架总览 2.2 实现接口总览 2.2.1 构造函数 2.2.2 拷贝构造 2.2.3 赋值重载 2.2.4 析构函数 2.2.5 二叉搜索树的遍历 2.2.6 插入函数 2.2.7 查找函数 2.2.8 删除函数 2.3 二叉搜索数完整…

MotionLayout动画效果实现的几种方式

前言MotionLayout 的使用大家应该都会了&#xff0c;如果不会看这里。本文就不科普如何使用&#xff0c;什么属性是什么意思&#xff0c;怎么使用之类的了&#xff0c;这里只是探讨一下 MotionLayout 效果实现的几种方式。一、ConstraintLayout 的方式定义我们知道 MotionLayou…

第三回:布局格式定方圆

import numpy as np import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False #用来正常显示负号一、子图 1. 使用 plt.subplots 绘制均匀状态下的子图 返回元素分…

ROS1学习笔记:ROS中的坐标管理系统(ubuntu20.04)

参考B站古月居ROS入门21讲&#xff1a;ROS中的坐标系管理系统 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录一、机器人中的坐标变换二、TF功能包三、小海龟跟随实验3.1 启动实验3.2 查看当前的TF树3.3 坐标相对位置可视化3.3.1 tf_echo3.3.2 rviz一、机器人中的坐标变换…

2023上半年软考,广州/东莞/深圳/江苏报班是明智的选择

软考是全国计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;项目&#xff0c;是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试&#xff0c;既属于国家职业资格考试&#xff0c;又是职称资格考试。 系统集成…

飞桨paddlenlp安装报错python setup.py egg_info did not run successfully.

原因缺少setuptools_scm 安装setuptools_scm pip install setuptools_scm 然后再安装paddlenlp就会噼里啪啦的下载一大堆东东了 下载OVER

【K8S系列】第十四讲:初识K8s架构之服务器的变迁

目录 序言 1简介 1.1 物理机时代 物理服务器的缺点 1.2 虚拟机 虚拟机优缺点 1.3 容器时代 1.4 总结 2 容器编排 2.1 什么是容器编排 序言 人生犹如一股奔流&#xff0c;没有暗礁&#xff0c;激不起美丽的浪花。 三言两语&#xff0c;不如细心探索 今天学习一下K8s…

ROS从入门到精通2-6:Rviz可视化进阶(画坐标轴、直线、平面、圆柱等)

目录0 专栏介绍1 Rviz可视化2 环境配置3 使用方法4 测试用例0 专栏介绍 本专栏旨在通过对ROS的系统学习&#xff0c;掌握ROS底层基本分布式原理&#xff0c;并具有机器人建模和应用ROS进行实际项目的开发和调试的工程能力。 &#x1f680;详情&#xff1a;《ROS从入门到精通》…

因《狂飙》张颂文,吐槽广东人比内地人聪明,周杰才是地域黑鼻祖

最近一段时间&#xff0c;电视剧《狂飙》落下帷幕&#xff0c;但是关于这部电视剧的争议&#xff0c;却从来就没有停止过。尤其是主演张颂文&#xff0c;更是受到了大家的关注&#xff0c;不但圈住了很多的粉丝&#xff0c;影视圈很多同行也对他赞许有加。 自古以来同行是冤家&…