02_Collection

文章目录

  • 集合
    • Java的集合类
  • Collection
    • iterator方法

集合

在Java中,指的就是存放数据的容器,是一个载体,可以一次容纳多个对象。

解决Bug的两种方法

    1. 打印
    • System.out.println();
    • log.info();
    1. debug
    • 检查数据

Java的集合类

在这里插入图片描述
Collection

  • 存储一个一个的数据
    • 先理解为一个袋子,往里面装数据。有各种各样的子实现。
  • Collection是最基本的集合接口,一个 Collection 代表一组Object,即 Collection 的元素
    • Java不提供直接实现自Collection的类,只提供继承于的子接口(如List和set)。

Map

  • 存储的是键值对数据
  • 存储key-value结构的数据。
    • key-value结构:就是可以根据一个key,找到一个对应的value。
    • Map 接口存储一组键值对象,提供key(键)到value(值)的映射。

Collection

特点

  1. Collection是顶级接口,用描述数据存储的接口
  2. Collection的一些子实现有序,一些无序
    • 有序和无序是指:存储和读取的顺序
  3. 一些子实现允许存储重复的数据,一些不允许
    • 允许重复:
    • 不允许重复:
  4. 一些子实现允许存储null,一些不允许
    • 允许存储null:
    • 不允许存储null:

API

  1. 增删改查方法
boolean add(E e): // 添加一个元素进入Collection

boolean addAll(Collection<? extends E> c): // 添加一个Collection进目标Collection

boolean remove(Object o)// 删除元素, 只删除第一个出现的(如果存在多个)

boolean removeAll(Collection<?> c)// 删除Collection中的所有存在的元素,会全部删除,如果存在多个

boolean contains(Object o)// 判断是否存在指定元素

boolean containsAll(Collection<?> c)// 判断给定的collection中是否全部存在于目标Collection

boolean retainAll(Collection<?> c)// 将原有collection只保留传入的collection。
  1. 特殊方法
void clear()// 清空collection

boolean equals(Object o)// 判断是否相等

int hashCode()// 计算hashCode

boolean isEmpty(): // 是否为空

int size()// collection里面的元素个数

如果hashcode()没有重写,代表地址值,并且equal()hashcode()要一起重写

重写hashcode()的目的:是为了让hashcode和对象里面的变量有关。

  1. 方便遍历方法
Object[] toArray(): // 将collection转成一个数组,方便遍历,(无参)

<T> T[] toArray(T[] a)// 类似,只是传入了一个数组 (有参)

Iterator<E> iterator()// 返回一个迭代器

eg:

private static void testToArray() {
    Collection<String> collection = new ArrayList<>();

    collection.add("zs");
    collection.add("ls");
    collection.add("ww");

    // 数组的协变 支持用Object[] ---> 任意类型的数组
    Object[] objects = collection.toArray();
    for (int i = 0; i < objects.length; i++) {
        System.out.println(objects[i]);
    }
}

toArray的源码(有参构造):

public <T> T[] toArray(T[] a) {
  		// a是用来存储数据的数组。
        if (a.length < size)
          	// 1. 当数组长度小于集合的长度时候。只使用传入数组的类型
            // Make a new array of a's runtime type, but my contents:
            return (T[]) Arrays.copyOf(elementData, size, a.getClass());
  		// 2. 如果大于等于集合的长度时候,则直接使用这个数组
  		// 直接copy 
        System.arraycopy(elementData, 0, a, 0, size);
  
 		// 3. 并且,如果数组长度大于集合长度。直接把a[size] = null,直接把最后一个元素的后面置为null。
        if (a.length > size)
            a[size] = null;
        return a;
    }

直接使用toArray的弊端

  • 耗费时间,例如:要是拷贝100w大小的数据时间太长
  • 耗费空间,例如:存储100w数据占太多的空间
  • jvm耗时,后续使用完毕还需要gc处理

iterator方法

迭代器(iterator),有时又称光标(cursor)是程序设计的软件设计模式,可在容器对象(container,例如链表或数组)上遍访的接口,设计人员无需关心容器对象的内存分配的实现细节。

注意事项

  • Iterator是个接口,接口只定义规范,我们获取到了iterator,就可以使用这个对象对数据进行遍历。
  • 迭代器相当于只保留了一个标识,标识我可以怎么拿到这个数据,不copy数据所有操作的数据都是针对的原有的Collection
  • 比如Collection底层有的是数组,有的是链表。数组的Iterator里面维护的是下标链表的Iterator里面维护的是指针。所有的具体实现都交给具体的子类

方法

boolean hasNext(): // 是否有下一个元素

E next()// 获取下一个元素

void remove()// 删除刚刚遍历过的元素

eg:

private static void testIterator() {
    Collection<String> collection = new ArrayList<>();

    collection.add("zs");
    collection.add("ls");
    collection.add("ww");

	// 先生成一个迭代器
    Iterator<String> iterator = collection.iterator();

    // 是否有下一个元素
    boolean b = iterator.hasNext();
    System.out.println(b); // true

    // 返回下一个元素
    String next = iterator.next();
    System.out.println(next); // zs

    // 删除刚刚遍历过的元素
    iterator.remove();
    System.out.println(collection); // ls ww
}

Q迭代器是个游标,它遍历的时候,被别的线程,把原集合中加了几个元素,减了几个元素,那这时候这次遍历的意义大吗?

A

  • JDK采用了存储一个值的方式,去保证在迭代器使用过程中,原有的集合不被修改(当前线程、其他线程)。

  • 在Collection内部,有一个modCount,用来标识结构变化的次数(get/contains 这种查询不叫结构变化)

  • 生成迭代器的时候,存储这个expectedModCount=modCount,在调用 nextremove时候,会检查
    使用迭代器过程中,如果原结构发生了变化,会报并发修改异常。

  • 所以,不要在迭代器迭代过程中,去修改原集合。要不就是在迭代器生成之前,要不就在迭代器使用完成之后。

eg:
用iterator遍历的例子:

public class Demo3 {
    public static void main(String[] args) {
        Collection<Student> collection = new ArrayList<>();
        collection.add(new Student("zs",17,89,"20210104"));
        collection.add(new Student("ww",18,79,"20210105"));
        collection.add(new Student("ls",19,99,"20210105"));
        collection.add(new Student("ml",17,91,"20210104"));
        collection.add(new Student("zq",20,85,"20210104"));

        System.out.println("遍历前:" + collection);

        Iterator<Student> iterator = collection.iterator();

        while(iterator.hasNext()){
            if(iterator.next().getAge() == 17){
                iterator.remove();
            }
        }

        System.out.println("遍历后:" +  collection);
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目管理十大知识领域之项目干系人管理

一、项目干系人管理的概念解析 项目干系人管理是指在项目执行过程中&#xff0c;对项目相关方的需求进行识别、分析和管理的过程。项目干系人管理的核心在于有效地沟通、协调和满足各方的需求&#xff0c;以确保项目能够顺利实施并达到预期的成果。在现代项目管理实践中&#…

conda国内加速

1、配置国内源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 2、显示源地址 conda config --set show_channel_urls yes

Python实现GEE嵌套协方差结构仿真模型(GEE算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义估计方程&#xff08;Generalized Estimating Equations, GEE&#xff09;是一种用于分析具有重复…

CC工具箱使用指南:【按条件选择排序】

一、简介 此工具来自一个群友的需求&#xff0c;做完想想可能会有同样需求的人用得到&#xff0c;就稍改了一下做成公共版本。 具体需求是这样的&#xff1a; 1、按条件选择对部分图斑进行排序&#xff0c;比如说在所有地类中&#xff0c;只想对地类名称为【林地】的图斑进行…

【Elasticsearch】索引恢复(recovery)流程梳理之副本分片数据恢复

replica shard重启具体流程 replica shard node &#xff08;generic threadpool&#xff09; 也是因为应用新的集群状态触发recovery&#xff0c;进入index阶段进入translog 阶段。先尝试重放本地的translog到global checkpoint向primary shard发起start recovery的请求&…

C++参悟:正则表达式库regex

正则表达式库regex 一、概述二、快速上手Demo1. 查找字符串2. 匹配字符串3. 替换字符串 三、类关系梳理1. 主类1. basic_regex 2. 算法1. regex_match2. regex_search3. regex_replace 3. 迭代器4. 异常5. 特征6. 常量1. syntax_option_type2. match_flag_type3. error_type 一…

【Linux】第三十站:进程间通信

文章目录 一、是什么二、为什么三、怎么办四、管道1.什么是管道2.管道的原理3.接口4.编码实现5.管道的特征6.管道的四种情况 一、是什么 两个或者多个进程实现数据层面的交互 因为进程独立性的存在&#xff0c;导致进程通信的成本比较高 通信是有成本的&#xff0c;体现在要打破…

集美大学“第15届蓝桥杯大赛(软件类)“校内选拔赛 D矩阵选数

经典的状态压缩DP int dp[15][(1<<14)10]; int a[15][15]; void solve() {//dp[i][st]考虑到了第i行 并且当前考虑完第i行以后的选择状态是st的所有方案中的最大值for(int i1;i<13;i)for(int j1;j<13;j)cin>>a[i][j];for(int i1;i<13;i){for(int j0;j<…

conda修改默认环境安装位置

conda修改默认环境安装位置 文章目录 conda修改默认环境安装位置查看conda配置信息创建.condarc&#xff08;conda runtime controlling)配置文件没有.condarc怎么办 即使创建正确放置了.condarc创建环境时还是默认指定C盘目录写权限目录修改权限 查看conda配置信息 conda con…

Flutter 页面嵌入 Android原生 View

前言 文章主要讲解Flutter页面如何使用Android原生View&#xff0c;但用到了Flutter 和 Android原生 相互通信知识&#xff0c;建议先看完这篇讲解通信的文章 Flutter 与 Android原生 相互通信&#xff1a;BasicMessageChannel、MethodChannel、EventChannel-CSDN博客 数据观…

1027 打印沙漏 (20)

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”&#xff0c;要求按下列格式打印 ************ *****所谓“沙漏形状”&#xff0c;是指每行输出奇数个符号&#xff1b;各行符号中心对齐&#xff1b;相邻两行符号数差2&#xff1b;符号数先从大到小顺序递…

数据结构:顺序表 模拟实现及详解

目录 一、线性表 二、顺序表 2.1顺序表的概念及结构 2.1.1静态顺序表 2.2.2动态顺序表 2.2动态顺序表接口实现 一、线性表 线性表&#xff08; linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见…

如何使用iPhone或iPad上的二维码共享Wi-Fi密码?这里有详细步骤

你有没有想过在不泄露网络密码的情况下与客人共享你的家庭或工作Wi-Fi?你肯定不是第一个这样想的人,我们很高兴地通知你,多亏了以下这个的变通方法,你现在可以使用iPhone或iPad做到这一点。 通常,如果你想让其他人访问网络,你需要共享你的Wi-Fi密码。苹果通过引入与任何…

Jetpack Compose -> 分包 自定义Composable

前言 上一章我们讲解了 Compose 基础UI 和 Modifier 关键字&#xff0c;本章主要讲解 Compose 分包以及自定义 Composable&#xff1b; Compose 如何分包 我们在使用 Button 控件的时候&#xff0c;发现如果我们想给按钮设置文本的时候&#xff0c;Button 函数并没有直接提供…

读书笔记-《数据结构与算法》-摘要8[桶排序]

桶排序和归并排序有那么点点类似&#xff0c;也使用了归并的思想。大致步骤如下&#xff1a; 设置一个定量的数组当作空桶。Divide - 从待排序数组中取出元素&#xff0c;将元素按照一定的规则塞进对应的桶子去。对每个非空桶进行排序&#xff0c;通常可在塞元素入桶时进行插入…

C#中ArrayList运行机制及其涉及的装箱拆箱

C#中ArrayList运行机制及其涉及的装箱拆箱 1.1 基本用法1.1.1 属性1.1.2 方法 1.2 内部实现1.3 装箱1.4 拆箱1.5 object对象的相等性比较1.6 总结1.7 其他简单结构类 1.1 基本用法 命名空间&#xff1a; using System.Collections; 1.1.1 属性 Capacity&#xff1a;获取或设…

【代码随想录10】20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

目录 20. 有效的括号题目描述参考代码 1047. 删除字符串中的所有相邻重复项题目描述参考代码 150. 逆波兰表达式求值题目描述参考代码 20. 有效的括号 题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;…

语音模块学习——LSYT201B模组(深圳雷龙科技)

目录 引子 处理器 外设 音频 蓝牙 模组展示 引子 关注我的老粉们应该知道我之前用过语音模块做东西&#xff0c;那个比较贵要50多。 今天这个淘宝20元左右比那个便宜&#xff0c;之前那个内核是51的&#xff0c;一个8位机。 后面我做东西的时候语音模块可能会换成这个&…

【51单片机】动态数码管

0、前言 参考&#xff1a; 普中51单片机开发攻略–A2.pdf 1、数码管介绍 上一章我们主要是介绍一位数码管的内部结构及控制原理。下面我们再来介 绍下多位数码管及动态显示原理的相关知识。 1.1 多位数码管简介 2、74HC245 和 74HC138 芯片介绍 2.1 74HC245 芯片简介 2.2 7…

Flink入门教程

使用flink时需要提前准备好scala环境 一、创建maven项目 二、添加pom依赖 <properties><scala.version>2.11.12</scala.version></properties><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library<…