Java-集合(1)

news2024/11/19 18:32:49

什么是集合?

在前面的学习中,保存多个数据,用的是数组。
但是数组有很多不同的地方:
1.长度开始时必须指定,且一旦指定无法更改
2.保存的必须为同一类型元素,虽说可以多态保存,但是限制性也很大
3.使用数组进行增加删除元素 比较麻烦

所以就产生了集合类这个概念
所谓集合:简单来讲,集合就是一个放数据的容器,准确的说是放数据对象引用的容器。 可以理解为另一种类似数组的东西,也是用于存放数据的。但是比数组方便。

专业性来说:
集合就是由若干个确定的元素所构成的整体,集合是存储对象的容器,可以存储任意数量任意类型的对象。

在Java中,如果一个Java对象 可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合。数组也可以看作是一种集合

集合的好处:
1.可以动态保存任意多个对象
2.提供了一系列方便的操作对象:add remove set get等
3.使用集合来增删改查比较方便

集合框架

集合的学习离不开集合框架,接下来就一个个学习。认识集合到底怎么用

集合分为单列集合 和 双列集合:暂时可以理解为单列集合一次只能存一个,双列集合一次可以存好多个

单列集合框架图:
在这里插入图片描述

双列集合框架图:

在这里插入图片描述

Collection集合

Collection接口集成于Iterator,Collection里还定义了很多方法,这些方法也都会继承到各个子接口和实现类里,而这些 API 的使用也是日常工作和面试常见常考的.
在这里插入图片描述

集合的使用最常用的就是CRUD功能:
增 add()/addAll()
删 remove()removeAll()
改 Collection Interface 里并没有直接改元素的操作
查 contains()/ containsAll()
其他 isEmpty()/size()/toArray()
Collection要点

  1. Collection的实现子类,可以存放多个元素,每个元素可以是Object
  2. Collection的实现子类,可以存放重复的元素,有些不可以
  3. Collection的实现子类,有些是有序的(List),有些不是有序的(Set)
  4. Collection接口没有直接实现的子类,是通过他的子接口Set和List来实现的

演示:
因为Collection是接口,无法实例化,所以使用向上转型Collection指向Arraylist,演示

public class test1 {
    public static void main(String[] args) {
        Collection list = new ArrayList();
        //add:添加单个元素
        list.add("jack");
        System.out.println(list);
        //remove:删除指定元素
        list.remove("jack");
        System.out.println(list);
        //contains:查找某个元素是否存在
        System.out.println(list.contains("jack"));
        //size:获取元素个数
        System.out.println(list.size());
        //isEmpty:判断是否为空
        System.out.println(list.isEmpty());
        //clear:清空所有元素
        list.clear();
        //addAll:添加多个元素
        Collection list2 = new ArrayList();
        list2.add("张三");
        list2.add("李四");
        list.addAll(list2);
        System.out.println(list);
        //containsALL:查找多个元素是否都存在
        System.out.println(list.containsAll(list2));
        //removeAll:删除多个元素
        list.removeAll(list2);
    }
}

false
0
true
[张三, 李四]
true

迭代器Iterator

Iterator对象称为迭代器,主要用于遍历Collection集合中的元素
所有实现了Collection接口的集合类,都有一个lterator()方法,用于返回一个实现了lterator接口的对象,即返回一个迭代器。
lterator用于遍历集合,lterator本身不存放对象

迭代器的执行原理
lterator iterator = list.iterator(); // 得到一个迭代器
hasNext();//判断是否还有下一个元素
next();//指针下移,将下移后对应的元素返回
图示:
在这里插入图片描述
注意:在使用迭代器的next()方法前,必须要先调用hasNext()方法进行检测,否则若没有下一个元素,直接使用next(),会抛出NoSuchElementException异常

迭代器使用演示:

public class test1 {
    public static void main(String[] args) {
        Collection list = new ArrayList();
        list.add(new Book("三国演义","罗贯中",78));
        list.add(new Book("红楼梦","曹雪芹",124));
        list.add(new Book("西游记","吴承恩",88));
        //获取迭代器
        Iterator iterator = list.iterator();
        //使用迭代器进行遍历
        while (iterator.hasNext()) {
            Object next =  iterator.next();
            System.out.println(next);
        }
    }
}
class Book{
    String name;
    String author;
    double price;
    public Book(String name, String author, double price) {
        this.name = name;
        this.author = author;
        this.price = price;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}

输出:
Book{name=‘三国演义’, author=‘罗贯中’, price=78.0}
Book{name=‘红楼梦’, author=‘曹雪芹’, price=124.0}
Book{name=‘西游记’, author=‘吴承恩’, price=88.0}

当执行到最后一个元素时,hasNext返回为false,此时iterator.next指向 西游记",“吴承恩”,88
也就是最后一个,如果要复原,可以重新再获取一次迭代器 iterator = list.iterator();

增强for循环

增强for循环可以代替iterator迭代器
特点:增强for循环就是简化版的iterator。本质一样,只能用于遍历集合或数组

使用语法:
for(元素类型 元素名:集合名或数字名){
访问元素
}
使用演示:

public class test1 {
    public static void main(String[] args) {
        Collection list = new ArrayList();
        list.add(new Book("三国演义","罗贯中",78));
        list.add(new Book("红楼梦","曹雪芹",124));
        list.add(new Book("西游记","吴承恩",88));
        for (Object o: list) {
            System.out.println(o);
        }
        }
    }

输出:
Book{name=‘三国演义’, author=‘罗贯中’, price=78.0}
Book{name=‘红楼梦’, author=‘曹雪芹’, price=124.0}
Book{name=‘西游记’, author=‘吴承恩’, price=88.0}

根据debug可以看到,底层还是使用iterator的hasNext和next。

Collection集合练习

请编写程序:
1.创建3个Dog{name,age}对象,放入ArrayList中,赋给List引用
2.用迭代器和增强for循环,遍历
3.重写Dog的toString方法,输出name和age

public class test {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(new Dog("小黄",2));
        list.add(new Dog("小白",2));
        list.add(new Dog("小黑",1));
        System.out.println("iterator迭代器遍历");
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            Object o = iterator.next();
            System.out.println(o);
        }
        System.out.println("增强for遍历");
        for (Object o2:list) {
            System.out.println(o2);
        }
    }
}
class Dog{
    private String name;
    private int age;
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + this.getName() + '\'' +
                ", age=" + this.getAge() +
                '}';
    }
}

输出:
iterator迭代器遍历
Dog{name=‘小黄’, age=2}
Dog{name=‘小白’, age=2}
Dog{name=‘小黑’, age=1}
增强for遍历
Dog{name=‘小黄’, age=2}
Dog{name=‘小白’, age=2}
Dog{name=‘小黑’, age=1}

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

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

相关文章

再学C语言17:类型转换

语句和表达式通常只应该使用一种类型的常量和变量 如果使用混合类型,C将会使用一个规则集合自动完成类型转换 一、基本的规则 1)当出现在表达式中时,有符号和无符号的char类型和short类型都将自动被转换为int(在需要的情况下将…

新华三“智・行中国2022”|大厂行动,如何擘画“内循环”的数字未来?

作者 | 曾响铃 文 | 响铃说 继农业经济、工业经济之后,数字经济登上历史的舞台,成为大国的主要经济形态。在我国,根据中国信息通信研究院发布的《中国数字经济发展白皮书(2022年)》,截至2021年&#xff0…

关于浙大MPA复试的一些常规问题

2022年联考笔试刚刚落下帷幕,就收到很多小伙伴关于浙大MPA项目复试的问题咨询,趁着今天有空就大家问的一些问题在这里统一做个回复哦~1、问:正常情况下多少分可以进入浙大MPA项目复试? 答:统计了2018——2022浙大MPA项…

Harmony/OpenHarmony应用开发-转场动画组件内转场

组件内转场主要通过transition属性配置转场参数,在组件插入和删除时显示过渡动效,主要用于容器组件中的子组件插入和删除时,提升用户体验(需要配合animateTo才能生效,动效时长、曲线、延时跟随animateTo中的配置&#…

GitHub官网下载Axios.js步骤

目录 前言必读 一、下载步骤 1.进入GitHub官网 2.搜索axios 3.点击这个axios/axios 4.点击压缩包下载 5.解压,进入到dist文件里面就找到了 二、使用方法 前言必读 读者手册(必读)_云边的快乐猫的博客-CSDN博客 一、下载步骤 1.进入…

数据在内存中的存储(11)

目录 1、数据类型介绍 1、类型的基本归类 1、整形家族: 2、浮点数家族: 3、构造类型(自定义类型): 4、指针类型: 5、空类型: 2、整形在内存中的存储 1、原码、反码、补码 2、大小端介…

[框架]Mybatis的使用

目录一、数据持久化的概念及ORM(Object Relational Mapping “对象关系映射”)的原理1.1 持久化1.2 ORM(Object Relational Mapping)1.3 ORM解决方案(包含四个部分)二、MyBatis简介2.1 简介2.2 特点2.3 MyB…

数据结构-考研难点代码突破(C++实现无向图图最小生成树算法(Prim,Kruskal)图解操作细节(引自C语言中文网))

以代码的方式复习考研数据结构知识点,这里在考研不以代码为重点,而是以实现过程为重点 文章目录1. 无向图最小生成树算法Kruskal算法C代码实现Prim算法C代码实现1. 无向图最小生成树算法 常见基本概念记忆: 生成树定义: 无向图中…

MySQL索引相关知识

1、什么是索引? 索引是存储引擎用于提高数据库表的访问速度的一种数据结构。通过给字段​​添加索引​​​可以​​提高数据的读取速度​​​,提高项目的并发能力和抗压能力。​​索引优化​​​时mysql中的一种优化方式。索引的作用相当于​​图书的目录…

一文搞懂Linux内核进程原理及系统调用机制

进程四要素 有一段程序代其执行有进程专用的系统堆栈空间在内核有task_struct数据结构进程有独立的存储空间,拥有专有的用户空间 如果具备前三点缺少第四条,称为“线程”;如果完全没有用户空间,称为“内核线程”;如果共享用户空间…

中国剩余定理

最近总是用到中国剩余定理,以前对于这个定理非常的模糊,有时间静下心来简单的学习一下中国剩余定理,文章没有深度,写下这篇博客以作记录。 中国剩余定理CRT前言一、描述二、中国剩余定理求解方法1.除以三余二2.除以五余三3.除以七…

14. UserAgent 反爬是如何实现的,来看看这篇博客

本篇博客实现 【爬虫训练场】 的第一个反爬案例,User-Agent 反爬。 文章目录什么是 User-Agent 反爬在 Python Flask 中实现 User-Agent 反爬什么是 User-Agent 反爬 User-Agent 反爬是一种防止网站被爬虫爬取的技术。 当爬虫向网站发送 HTTP 请求时,会…

初识Kubernetes:(3)Kubernetes资源管理

初识Kubernetes:(3)Kubernetes资源管理1 资源管理介绍2 YAML语法介绍2.1 YAML语法介绍2.2 YAML语法示例2.2.1 YAML常量2.2.2 对象2.2.3 数组3 资源管理方式3.1 资源管理方式3.2 命令式对象管理3.2.1 kubectl命令3.2.2 操作(comman…

操作系统期末考试必会题库2——进程管理

1、某系统出现故障,通过相关指令查看,CPU占有率为0,内存有大量空余,但是用户在其程序中得不到任何相应,请从进程状态分析,当前用户所使用的进程可能是什么状态(就绪,运行&#xff0c…

BLE 蓝牙抓包分析

1. 抓包工具 Ellisys & Ellisys Bluetooth Analyzer ​使用方法:https://blog.csdn.net/weixin_44260005/article/details/121216529​ 2. BLE数据样式 3. 数据分析 3.1 ble蓝牙协议栈 3.2 BLE连接过程 http://doc.iotxx.com/BLE%E6%8A%80%E6%9C%AF%E6%8F%AD%…

如何用Alluxio加速云上深度学习训练?

欢迎来到【微直播间】,2min纵览大咖观点 随着企业数据量的不断增加,为了提高深度学习训练的准确性、加快速度并且降低成本,许多企业开始逐步在云上实施分布式训练的方案,本期内容将结合阿里、微软等实际应用案例,分享…

容器安装mysql

1.自己配置仓库和挂载 仓库内容如下 挂载 2.安装工具包 yum install -y yum-utils 3.从阿里云添加docker仓库 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 我们就能查看到 4.cd回主目录开始一系列安装 yum install d…

软件测评师教程之软件测试基础<一>更新中...

目录一.软件测试分类(1)按照开发阶段划分(2)按照测试实施组织划分(3)按照测试技术划分二.软件测试过程模型(1)V模型(2)W模型(3)H模型(4)X模型(5)前置测试模型(6)测试模型的使用三.软件测试策略(1)测试信息流(2)分析设计阶段1.需求说明书评测2.概要设计说明书评测3.详细设计说明…

手绘图说电子元器件-控制与保护器件

控制与保护器件主要包括继电器、开关、接插件和保险器件等,是电子电路中经常使用的器件。 继电器 继电器是一种常用的控制器件,它可以用较小的电流来控制较大的电流,用低电压来控制高电压,用直流电来控制交流电等,并且可实现控制电路与被控电路之间的完全隔离。 继电…

IPV6探测

目录本机是否支持IPv6如何确认一个网站是否开启 IPv6在线工具:IP查询在线工具:IPv6连接测试在线工具:国家IPv6发展监测平台本地工具局域网设备探测pingMSFThc-Ipv6Ipv6-Toolkit端口探测MSFNmap【存在问题】参考领导提了个问题,怎么…