02_Collection

news2024/9/26 3:25:12

文章目录

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

集合

在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转成一个数组,方便遍历,(无参)
// 就是把原有的集合copy成了一个数组

<T> T[] toArray(T[] a)// 类似,只是传入了一个数组 (有参)
// 1. 当传入的数组长度小于集合长度 --- 则只会使用类型,直接copy一份
// 2. 当传入的数组长度等于集合长度 --- 使用传入的数组
// 3. 当传入的数组长度大于集合长度 --- 会使用传入的数组,最后一个元素后面一个,会置为null

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(): // 是否有下一个元素
// 只会返回true false,反复调用,光标不会挪动

E next()// 获取下一个元素
// 挪动光标,返回刚刚扫过的元素
// 如果下一个没有元素,则会报错 NoSuchElementException

void remove()// 删除刚刚遍历过的元素
// 不能直接调用remove,必须要先遍历
// 不可以连续两次调用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);
    }

Collection的遍历

  1. 使用无参构造方法
Object[] array = collection.toArray();
for (int i = 0; i < array.length; i++) {
    String s = (String) array[i];
    System.out.println(s);
}
  1. 使用有参构造方法
String[] array = collection.toArray(new String[0]);
for (int i = 0; i < array.length; i++) {
    System.out.println(array[i]);
}
  1. 使用foreach循环
for (String s : collection) {
    System.out.println(s);
}
  1. 使用迭代器
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

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

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

相关文章

CentOs7 安装Mysql(5.7和8.0版本)密码修改跳过 超详细教程

CSDN 成就一亿技术人&#xff01; 今天出一期Centos下安装Mysql&#xff08;详细教程&#xff09;包括数据库密码跳过修改 CSDN 成就一亿技术人&#xff01; 目录 1.获取安装包 2.安装程序 安装下载的rpm包 查看安装包 修改5.7版本&#xff08;重要&#xff09; 安装M…

【RHCE服务搭建实验】之DNS

目录 一、DNS简介二、安装DNS 一、DNS简介 域名系统&#xff08;DNS&#xff09;是一个分层的分布式数据库。它存储用于将Internet主机名映射到IP地址&#xff08;反之亦然&#xff09;的信息、邮件路由信息以及Internet应用程序使用的其他数据。 客户端通过调用解析器库在DNS…

股权众筹模式介绍(上)

众筹&#xff0c;是指个人或小企业通过互联网向大众筹集资金的一种项目融资方式&#xff0c;根据众筹的筹集目的和回报方式&#xff0c;可以分为债权众筹、回报众筹、股权众筹和捐赠众筹四大类。本文重点介绍我国股权众筹的几种模式。 一、众筹当事方 一个众筹项目&#xff0…

【ARMv8M Cortex-M33 系列 7 -- RA4M2 移植 RT-Thread 问题总结】

请阅读【嵌入式开发学习必备专栏 】 文章目录 问题小结栈未对齐 经过几天的调试&#xff0c;成功将rt-thead 移植到 RA4M2&#xff08;Cortex-M33 核&#xff09;上&#xff0c;thread 和 shell 命令已经都成功支持。 问题小结 在完成 rt-thread 代码 Makefile 编译系统搭建…

【LeetCode: 12. 整数转罗马数字 + 模拟 + 有序表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

WampServer

开发笔记 推荐链接php无法保存SESSION问题部署SSL时候产生的问题 推荐链接 链接目录 php无法保存SESSION问题 php.ini文件和phpForApache.ini 文件 里面都有 对路径的控制&#xff0c;相关路径问题可能也需要进行修改&#xff0c;打开文件搜索wamp64或wamp 就可以看到了&…

PowerShell install 一键部署grafana

grafana 前言 Grafana 是一款开源的数据可视化和监控仪表盘工具。它提供了丰富的数据查询、可视化和报警功能,可用于实时监控、数据分析和故障排除等领域。 通过 Grafana,您可以连接到各种不同的数据源,包括时序数据库(如 Prometheus、InfluxDB)和关系型数据库(如 MySQ…

透明拼接屏生产商:如何选择合格供应商

随着透明拼接屏市场的不断扩大&#xff0c;越来越多的生产商加入其中。对于需求方而言&#xff0c;选择一家合格的生产商至关重要。本文将围绕如何选择透明拼接屏生产商展开讨论&#xff0c;同时结合对尼伽OLED显示屏的了解&#xff0c;为您推荐这一领域的优质供应商。 一、透明…

springboot102基于web的音乐网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的基于web的音乐网站 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 …

网络防御保护1

网络防御保护 第一章 网络安全概述 网络安全&#xff08;Cyber Security&#xff09;是指网络系统的硬件、软件及其系统中的数据受到保护&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;系统连续可靠正常地运行&#xff0c;网络服务不中断 随着数…

vue3前端开发,如何引入element-plus前端框架及配置参数

vue3前端开发,如何引入element-plus前端框架及配置参数&#xff01;这是一个简单的教程&#xff0c;帮助大家快速在自己的项目中引入element-plus框架。 主要是介绍的引入流程和参数的配置情况。 如图&#xff0c;这个就是elment-plus前端框架里面的一个主按钮展示。表示我们配…

什么勒索攻击,应该如何防护?

当前&#xff0c;勒索攻击、僵尸网络攻击、DDos攻击、APT攻击、挖矿攻击、供应链攻击、网站攻击、电信诈骗等各种攻击手段层出不穷。 勒索攻击应该是今年网络安全行业讨论最多的话题&#xff0c;勒索钱财或者窃取商业数据是黑产最主要的目的。 勒索软件的攻击特征 与其它攻击行…

【 CSS 】基础1

“坚持就是胜利。” - 温斯顿丘吉尔 【 CSS 】基础 1 CSS 简介 CSS 是层叠样式表 ( Cascading Style Sheets ) 的简称.有时我们也会称之为 CSS 样式表或级联样式表。CSS 也是一种标记语言CSS 主要用于设置 HTML 页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff…

从零学Java - Stream API

Java - Stream API 文章目录 Java - Stream API什么是流(Stream)?Stream 的特点Stream使用步骤1 创建 Stream流2 中间操作3 终止操作 什么是流(Stream)? 流&#xff08;Stream&#xff09;与集合类似&#xff0c;但集合中保存的是数据&#xff0c;而Stream中保存对集合或数组…

什么是WAF

WAF是Web应用防火墙&#xff08;Web Application Firewall&#xff09;的简称&#xff0c;是一款通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的产品。 WAF主要用于防御Web应用攻击&#xff0c;例如SQL注入、跨站脚本攻击&#xff08;XSS&#xff09;、网页…

Win10/11中VMware Workstation设置网络桥接模式

文章目录 一、添加VMware Bridge Protocol服务二、配置桥接参数1.启用系统Device Install Service服务2.配置VMware 需要确认物理网卡是否有添加VMware Bridge Protocol服务 添加VMware Bridge Protocol服务 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

代码随想录算法训练营DAY24|回溯1

算法训练DAY24|回溯1 第77题. 组合 力扣题目链接 给定两个整数 n 和 k&#xff0c;返回 1 ... n 中所有可能的 k 个数的组合。 示例: 输入: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] 上面我们说了要解决 n为100&#xff0c;k为50的情况&#xff0…

Xcode查看APP文件目录

一、连接真机到MAC电脑上 二、打开Devices 点击window -> Devices and Simulatores 三、选中设备、选择app 四、选择下载内容 五、查看文件内容 得到的文件 右键显示包内容&#xff0c;获得APP内数据 六、分发证书无法下载 使用分发的证书无法下载文件内容&#xf…

Kui: 一个用于 Kubernetes 的“混合”CLI/GUI 应用程序

众所周知&#xff0c;当涉及到管理服务器或 Kubernetes 集群之类的事情时&#xff0c;我们大多数人更喜欢使用我们心爱的终端而不是 GUI 工具。对于许多人来说&#xff0c;这就像驾驶一辆带有手动变速箱的汽车&#xff1a;简单、舒适、灵活且更可预测。Kui 是一个混合界面工具&…

Servlet系列:生命周期(init、 service、destroy)详解

Servlet的生命周期是由Web容器&#xff08;如Tomcat&#xff09;管理的&#xff0c;包括以下三个阶段&#xff1a; 加载和实例化&#xff1a;当Web应用程序启动时&#xff0c;Web容器会加载和实例化Servlet。加载和实例化过程可以在应用程序启动时自动完成&#xff0c;也可以通…