集合框架(1)
集合框架(1)
1、数组的特点与弊端
(1)特点:
-
- 数组初始化以后,长度就确定了。
- 数组中的添加的元素是依次紧密排列的,有序的,可以重复的。
- 数组声明的类型,就决定了进行元素初始化时的类型。不是此类型的变量,就不能添加。
- 可以存储基本数据类型值,也可以存储引用数据类型的变量
- Object []arr = new Object[10];
arr[0] = new String();
arr[1] = new Date();
(2)弊端
-
- 数组初始化以后,长度就不可变了,不便于扩展
- 数组中提供的属性和方法少,不便于进行添加、删除、插入、获取元素个数等操作,且效率不高。
- 数组存储数据的特点单一,只能存储有序的、可以重复的数据
- Java 集合框架中的类可以用于存储多个对象,还可用于保存具有映射关系的关联数组。
2、集合框架体系介绍
Java 集合可分为 Collection 和 Map 两大体系:
- Collection接口:用于存储一个一个的数据,也称单列数据集合。
- List子接口:用来存储有序的、可以重复的数据(主要用来替换数组,"动态"数组)
实现类:ArrayList(主要实现类)、LinkedList、Vector
-- Set子接口:用来存储无序的、不可重复的数据(类似于高中讲的"集合")
实现类:HashSet(主要实现类)、LinkedHashSet、TreeSet
- Map接口:用于存储具有映射关系“key-value对”的集合,即一对一对的数据,也称双列数据集合。(类似于高中的函数、映射。(x1,y1),(x2,y2) ---> y = f(x) )
- HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties
- JDK提供的集合API位于java.util包内
3、Collection接口
- JDK不提供此接口的任何直接实现,而是提供更具体的子接口(如:Set和List)去实现
- Collection 接口是 List和Set接口的父接口,该接口里定义的方法既可用于操作 Set 集合,也可用于操作 List 集合。方法如下:
(1) 添加:add方法
@Test
public void test1(){Collection collection = new ArrayList();//add 向集合中添加元素,添加内容为Object o;collection.add("TIRENDNESS");collection.add(1314);//自动装箱,int-->Integercollection.add(new Object());collection.add(new Person("QUM",18));}
addAll方法
//addAll
collection.addAll(collection1);//将collection1中的元素全部加入方法调用者Collection中
//加入后,对比原本的size长度 collection.size() = collection.size()+collection1.size()
另外;
//collection.add(collection1);此时将集合collection1看作一个对象
//加入后collection的size为 collection.size()++;
collection.addAll(collection1);
System.out.println(collection.size());
(2)判断
<3> int size():获取当前集合中实际存储的元素个数
<4>boolean isEmpty():判断当前集合是否为空集合
<5>boolean contains(Object obj):判断当前集合中是否存在一个与obj对象equals返回true的元素,此方法调用equals方法,若在String或者包装类Integer中已经重写,则检验字面量;若尚未重写,则比较地址值。
//contains
System.out.println(collection.contains(1314));//超出128,实际上比较两个new的对象,比较字面量。
//与==不同,与重写后的equals相同
System.out.println(collection.contains(new String("Qum")));//String类中重写过equals方法
System.out.println(collection.contains(new Person("Qum",18)));//false
//Person类中没有重写equals方法,因此调用equals方法时比较对象的地址,输出false
<6>boolean containsAll(Collection coll):判断coll集合中的元素是否在当前集合中都存在。即coll集合是否是当前集合的“子集”
<7>boolean equals(Object obj):判断当前集合与obj是否相等
(3)删除
<8> void clear():清空集合元素
<9> boolean remove(Object obj) :从当前集合中删除第一个找到的与obj对象equals返回true的元素。 (需要注意对象所属的类中equals方法是否完成重写)
<10> boolean removeAll(Collection coll):从当前集合中删除所有与coll集合中相同的元素。即this = this - this ∩ coll ,删除交集
<11> boolean retainAll(Collection coll):从当前集合中删除两个集合中不同的元素,使得当前集合仅保留与coll集合中的元素相同的元素,即当前集合中仅保留两个集合的交集,即this = this ∩ coll;保留交集
@Test
public void test2(){Collection collection = new ArrayList();collection.add("TIRENDNESS");collection.add(1314);collection.add(new Object());collection.add(new Person("Qum",18));System.out.println(collection);Collection collection1 = new ArrayList();collection1.add(new String("winner") );collection1.add(521);collection1.add(1314);System.out.println(collection.size());//remove,移除指定元素collection.remove(1314);//collection.remove(new Object());//无法移除,调用equals方法时无法找到与新建对象相同的集合元素collection.remove(new Person("Qum",18));//在Person类中重写equals方法则可以移除System.out.println(collection);//removeAll,从当前集合中删除与输入集合中相同的元素collection.removeAll(collection1);//retainAll,保留交集//clearcollection1.clear();System.out.println(collection1);
}
(4)其它
<12> Object[] toArray():返回包含当前集合中所有元素的数组
<13> hashCode():获取集合对象的哈希值
<14> iterator():返回迭代器对象,用于集合遍历
@Test
public void test3(){Collection collection = new ArrayList();collection.add("TIRENDNESS");collection.add(1314);collection.add(new Object());collection.add(new Person("Qum",18));System.out.println(collection);Collection collection1 = new ArrayList();collection1.add(new String("winner") );collection1.add(521);collection1.add(1314);Object []arr = collection1.toArray();System.out.println(Arrays.toString(arr));//打印数组值}
补充:关于数组与集合之间的转换
集合--->数组 调用toArray方法;collection.toArray();.
数组--->集合 调用Arrays.asList(Object o);方法
@Test
public void test4(){String [] arr = new String[]{"AA","BB"};Collection collection = Arrays.asList(arr);System.out.println(collection);
}
注意:包装类中的Integer值将基本数据类型int包装为对象,因此下面代码中两个数组size长度不同
@Test
public void test5(){//Arrays.asList(Object o);要求传入对象值,包装类可以做到,但基础数据类型不行。Integer []arr = new Integer[]{1,2,3};//包装类,Integer的值可以视作三个对象List list = Arrays.asList(arr);System.out.println(list.size());int []arr1 = new int[]{1,2,3};//基本数据类型,只能将数组视作对象放入asList方法中。List list1= Arrays.asList(arr1);System.out.println(list1.size());
}
4. Iterator(迭代器)接口
(1) Iterator接口
- 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口java.util.Iterator。Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同。
- Collection接口与Map接口主要用于存储元素
- Iterator,被称为迭代器接口,本身并不提供存储对象的能力,主要用于遍历Collection中的元素
- Collection接口继承了java.lang.Iterable接口,该接口有一个iterator()方法,那么所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个实现了Iterator接口的对象。
- public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合中的元素的。
- 集合对象每次调用iterator()方法都得到一个全新的迭代器对象,默认游标都在集合的第一个元素之前。
while (collection.iterator().hasNext()){System.out.println(iterator.next());
}//错误写法,会循环输出第一个集合元素//匿名对象只能使用一次!
- Iterator接口的常用方法如下:
- public E next():返回迭代的下一个元素。
- public boolean hasNext():如果仍有元素可以迭代,则返回 true。
- 注意:在调用it.next()方法之前必须要调用it.hasNext()进行检测。若不调用,且下一条记录无效,直接调用it.next()会抛出NoSuchElementException异常。
@Test
public void test1(){Collection collection = new ArrayList();collection.add("AA");collection.add("AA");Person p1 = new Person("Frank",24);collection.add(p1);collection.add(128);//自动装箱,int --->Intergercollection.add(new String("十二月一日,晴"));Iterator iterator = collection.iterator();//System.out.println(iterator.getClass());for (int i = 0; i <collection.size(); i++) {System.out.println(iterator.next());}//遍历输出//System.out.println(iterator.next());//如果超出集合中元素的个数,报NoSuchElementException异常//但操作中常常与hasNext搭配使用,hasNext方法检验迭代器中是否还存在没有输出的元素,并返回对应的布尔值,while (iterator.hasNext()){System.out.println(iterator.next());}}
(2)迭代器的执行原理
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素。
首先,调用hasNext()方法判断Iteractor实例是否还存在可以输出的集合元素,若返回true,则进入while循环,调用next()方法。
一旦next()方法执行,指针下移,将下移之后指向的集合元素返回。
使用Iterator迭代器删除元素:java.util.Iterator迭代器中有一个方法:void remove() ;
注意:
- Iterator可以删除集合的元素,但是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法。
- 如果还未调用next()或在上一次调用 next() 方法之后已经调用了 remove() 方法,再调用remove()都会报IllegalStateException。
- Collection已经有remove(xx)方法了,为什么Iterator迭代器还要提供删除方法呢?因为迭代器的remove()可以按指定的条件进行删除。
(3)foreach循环
- foreach循环(也称增强for循环)是 JDK5.0 中定义的一个高级for循环,专门用来遍历数组和集合的。
- 它用于遍历Collection和数组。通常只进行遍历元素,在遍历的过程中对集合元素不进行增删操作。
- foreach循环的语法格式:
for(元素的数据类型 局部变量 : Collection集合或数组){
//操作局部变量的输出操作
}
//这里局部变量就是一个临时变量,自己命名就可以
public class ForeachTest {@Testpublic void test1(){Collection collection = new ArrayList();collection.add("TIRENDNESS");collection.add(1314);collection.add(new Object());collection.add(new Person("Qum",18));System.out.println(collection);for (Object obj : collection){//对象类型 对象名 : 需要遍历的集合/数组名System.out.println(obj);}Object[]arr = collection.toArray();for (Object obj : arr){System.out.println(obj);}}
}
关于元素的增删:for循环内部输出语句可以输出修改后的值,若在for循环外部重新遍历,输出未进行修改的值。
@Test
public void test2(){String [] arr = new String[]{"AA","BB"};for (String str : arr){str = "HIHI";System.out.println(str);}//HIHI HIHI 虽然str与数组元素的地址不同,但此循环中输出修改后的strSystem.out.println();for (String str : arr){str = "HIHI";}for (String str : arr){System.out.println(str);}//AA BB,类似于String不可变性的讲解,str与数组中的元素位于不同地址System.out.println();for (int i = 0;i<arr.length;i++){arr[i] = "HIHI";System.out.println(arr[i]);}//HIHI HIHI}
相关文章:
集合框架(1)
集合框架(1) 1、数组的特点与弊端 (1)特点: 数组初始化以后,长度就确定了。数组中的添加的元素是依次紧密排列的,有序的,可以重复的。数组声明的类型,就决定了进行元素初…...
Java 基础之泛型:类型安全的保障与灵活运用
在 Java 编程的世界里,泛型是一个至关重要且非常实用的特性。它在 Java 5 中被引入,从根本上改变了我们处理数据类型的方式,提供了更强的类型安全保障,同时也增加了代码的复用性和可读性。 一、什么是泛型 泛型(Gener…...
开发者如何使用GCC提升开发效率Opencv操作
看此篇前请先阅读 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144216351?spm=1001…...
矩阵加法
矩阵加法 C语言代码C 语言代码Java语言代码Python语言代码 💐The Begin💐点点关注,收藏不迷路💐 输入两个n行m列的矩阵A和B,输出它们的和AB。 输入 第一行包含两个整数n和m,表示矩阵的行数和列数。1 <…...
yarn : 无法加载文件 E:\node\node_global\yarn.ps1,因为在此系统上禁止运行脚本
先确保安装了yarn —— npm install -g yarn 终端输入set-ExecutionPolicy RemoteSigned 若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,请使用以下命令将计算机上的执行策略更改为RemoteSigned 再去使用yarn okk~...
详解C++类与对象(四)
文章目录 1.类型转换1.1 前言1.2 类型转换的性质 2.static成员2.1 前言2.2 static的基本概念 3.友元4.内部类5.匿名对象 1.类型转换 1.1 前言 在C中,由于程序员可以自己显示定义一个新的类。这样就会出现一个问题:程序员自己显示定义的类类型与编译器中…...
Pandas处理和分析嵌套JSON数据:从字符串到结构化DataFrame
在数据分析领域,我们经常遇到需要从非结构化数据中提取有用信息的场景。特别是当数据以JSON字符串的形式出现时,如何有效地将其转换为结构化的表格形式,以便进行进一步的分析和处理,成为了一个常见的挑战。本文将通过一个具体的例…...
【强化学习入门笔记】1.5 贝尔曼最优公式
本系列为学习赵世钰老师的《强化学习的数学原理》所作的学习笔记. 课程视频网址:https://space.bilibili.com/2044042934 1.5.1 定义 1.5.1.1 Contraction mapping theorem (收缩映射定理) fixed point(不动点) 如果 x ∗ x^* x∗满足下式, x ∗ x^* x∗称之为…...
编码问题技术探讨:IDE全局GBK与项目UTF-8引发的中文乱码
在软件开发过程中,编码问题一直是开发者们需要面对和解决的难题之一。尤其是在使用IDE(集成开发环境)时,如果全局编码设置与项目编码设置不一致,往往会导致中文乱码的问题。本文将深入探讨这一问题的背景、示例以及解决…...
SpringBoot两天
SpringBoot讲义 什么是SpringBoot? Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式…...
自动化立体仓库项目任务调度系统中任务流程可视化实现
在运维自动化平台中,任务系统无疑是最核心的组成部分之一。它承担着所有打包编译、项目上线、日常维护等运维任务的执行。通过任务系统,我们能够灵活地构建满足不同需求的自定义任务流。早期的任务流后端采用了类似列表的存储结构,根据任务流内子任务的排序依次执行,尽管通…...
计算机毕业设计hadoop+spark民宿推荐系统 民宿数据分析可视化大屏 民宿爬虫 民宿大数据 知识图谱 机器学习 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Java中OGNL表达式语言的使用
文章目录 OGNL 介绍OGNL 使用场景- ognl- 主要功能- 注意事项- Ognl类的主要方法- 设置值- 获取值- 使用示例 - MybatisJava原生表达式的使用 - Fastjson- JSONPath类的主要方法- 主要功能- JSONPath的优势- 使用示例 Spring不选择OGNL的原因 OGNL 介绍 OGNL(Objec…...
[HCTF 2018]WarmUp-滑稽
启动场景打开链接,出现一下图片 F12查看代码出现一个注释,应该在这个文件中, 进入到该页面,出现一段代码 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["sourc…...
JAVAWeb——maven、SpringBoot、HTTP、Tomcat
目录 1.maven a.概述 b.作用 c.仓库 b.坐标 c.依赖管理 2.SpringBoot 3.HTTP a.概述 b.请求协议 c.响应协议 d.协议解析 4.Tomcat a.Web服务器 b.Tomcat c.SpringBoot与Tomcat关系 1.maven a.概述 Maven是apache旗下的一个开源项目,是一款用于管理…...
【C++】—— set 与 multiset
【C】—— map 与 set 1 序列式容器和关联式容器2 set 系列的使用2.1 set 和 multiset 参考文档2.2 set 类的介绍2.3 set 的迭代器和构造2.4 set的增删查2.4.1 insert2.4.2 find 与 erase2.4.3 count 2.5 lower_bound 与 upper_bound2.6 multiset 与 set 的差异2.6.1 不再去重2…...
蓝桥杯-扫雷
这题不难,就是麻烦一点,这里暴力求解了直接 题目链接: 扫雷 AC代码: import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan ne…...
黑马JavaWeb-day06、07、08(SQL部分) _
文章目录 MYSQL概述数据模型SQL简介SQL分类 DDL数据库操作表操作 DML增(INSERT)改(UPDATE)删(DELETE) DQL基本查询条件查询(where)分组查询(group by)排序查询…...
三十五:Wireshark的捕获过滤器
Wireshark 是一个广泛使用的网络协议分析工具,主要用于捕获和分析网络流量。它支持丰富的协议分析,并提供了多种过滤方式,以便用户在大量数据中精确地找到自己关注的内容。在Wireshark中,过滤器可以分为两类:捕获过滤器…...
第9章 大模型的有害性(上)
9.1 引言 本章将探讨大型语言模型(LLMs)可能带来的有害性,重点讨论以下几个方面: 性能差异社会偏见和刻板印象 在后续内容中,还会涉及其他层面的危害,如有害信息、虚假信息、隐私和安全风险、版权问题、…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
