当前位置: 首页 > news >正文

集合框架(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.IteratorIterator接口也是Java集合中的一员,但它与CollectionMap接口有所不同。
    • 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)

集合框架&#xff08;1&#xff09; 1、数组的特点与弊端 &#xff08;1&#xff09;特点&#xff1a; 数组初始化以后&#xff0c;长度就确定了。数组中的添加的元素是依次紧密排列的&#xff0c;有序的&#xff0c;可以重复的。数组声明的类型&#xff0c;就决定了进行元素初…...

Java 基础之泛型:类型安全的保障与灵活运用

在 Java 编程的世界里&#xff0c;泛型是一个至关重要且非常实用的特性。它在 Java 5 中被引入&#xff0c;从根本上改变了我们处理数据类型的方式&#xff0c;提供了更强的类型安全保障&#xff0c;同时也增加了代码的复用性和可读性。 一、什么是泛型 泛型&#xff08;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语言代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 输入两个n行m列的矩阵A和B&#xff0c;输出它们的和AB。 输入 第一行包含两个整数n和m&#xff0c;表示矩阵的行数和列数。1 <…...

yarn : 无法加载文件 E:\node\node_global\yarn.ps1,因为在此系统上禁止运行脚本

先确保安装了yarn —— npm install -g yarn 终端输入set-ExecutionPolicy RemoteSigned 若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本&#xff0c;请使用以下命令将计算机上的执行策略更改为RemoteSigned 再去使用yarn okk~...

详解C++类与对象(四)

文章目录 1.类型转换1.1 前言1.2 类型转换的性质 2.static成员2.1 前言2.2 static的基本概念 3.友元4.内部类5.匿名对象 1.类型转换 1.1 前言 在C中&#xff0c;由于程序员可以自己显示定义一个新的类。这样就会出现一个问题&#xff1a;程序员自己显示定义的类类型与编译器中…...

Pandas处理和分析嵌套JSON数据:从字符串到结构化DataFrame

在数据分析领域&#xff0c;我们经常遇到需要从非结构化数据中提取有用信息的场景。特别是当数据以JSON字符串的形式出现时&#xff0c;如何有效地将其转换为结构化的表格形式&#xff0c;以便进行进一步的分析和处理&#xff0c;成为了一个常见的挑战。本文将通过一个具体的例…...

【强化学习入门笔记】1.5 贝尔曼最优公式

本系列为学习赵世钰老师的《强化学习的数学原理》所作的学习笔记. 课程视频网址&#xff1a;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引发的中文乱码

在软件开发过程中&#xff0c;编码问题一直是开发者们需要面对和解决的难题之一。尤其是在使用IDE&#xff08;集成开发环境&#xff09;时&#xff0c;如果全局编码设置与项目编码设置不一致&#xff0c;往往会导致中文乱码的问题。本文将深入探讨这一问题的背景、示例以及解决…...

SpringBoot两天

SpringBoot讲义 什么是SpringBoot&#xff1f; Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xf…...

自动化立体仓库项目任务调度系统中任务流程可视化实现

在运维自动化平台中,任务系统无疑是最核心的组成部分之一。它承担着所有打包编译、项目上线、日常维护等运维任务的执行。通过任务系统,我们能够灵活地构建满足不同需求的自定义任务流。早期的任务流后端采用了类似列表的存储结构,根据任务流内子任务的排序依次执行,尽管通…...

计算机毕业设计hadoop+spark民宿推荐系统 民宿数据分析可视化大屏 民宿爬虫 民宿大数据 知识图谱 机器学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Java中OGNL表达式语言的使用

文章目录 OGNL 介绍OGNL 使用场景- ognl- 主要功能- 注意事项- Ognl类的主要方法- 设置值- 获取值- 使用示例 - MybatisJava原生表达式的使用 - Fastjson- JSONPath类的主要方法- 主要功能- JSONPath的优势- 使用示例 Spring不选择OGNL的原因 OGNL 介绍 OGNL&#xff08;Objec…...

[HCTF 2018]WarmUp-滑稽

启动场景打开链接&#xff0c;出现一下图片 F12查看代码出现一个注释&#xff0c;应该在这个文件中&#xff0c; 进入到该页面&#xff0c;出现一段代码 <?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旗下的一个开源项目&#xff0c;是一款用于管理…...

【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…...

蓝桥杯-扫雷

这题不难&#xff0c;就是麻烦一点&#xff0c;这里暴力求解了直接 题目链接&#xff1a; 扫雷 AC代码&#xff1a; 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增&#xff08;INSERT&#xff09;改&#xff08;UPDATE&#xff09;删&#xff08;DELETE&#xff09; DQL基本查询条件查询&#xff08;where&#xff09;分组查询&#xff08;group by&#xff09;排序查询…...

三十五:Wireshark的捕获过滤器

Wireshark 是一个广泛使用的网络协议分析工具&#xff0c;主要用于捕获和分析网络流量。它支持丰富的协议分析&#xff0c;并提供了多种过滤方式&#xff0c;以便用户在大量数据中精确地找到自己关注的内容。在Wireshark中&#xff0c;过滤器可以分为两类&#xff1a;捕获过滤器…...

第9章 大模型的有害性(上)

9.1 引言 本章将探讨大型语言模型&#xff08;LLMs&#xff09;可能带来的有害性&#xff0c;重点讨论以下几个方面&#xff1a; 性能差异社会偏见和刻板印象 在后续内容中&#xff0c;还会涉及其他层面的危害&#xff0c;如有害信息、虚假信息、隐私和安全风险、版权问题、…...

Unity连接Arduino BLE实战:5分钟实现PC端双向通信

1. 这不是“配对”&#xff0c;而是让Unity像手机App一样和Arduino对话很多人第一次尝试Unity连接Arduino蓝牙模块时&#xff0c;会下意识打开Windows的“蓝牙设置”去“添加设备”——结果折腾半小时&#xff0c;Unity里依然收不到任何数据。我最初也这么干过&#xff0c;直到…...

质谱仪核心部件与色谱联用技术全解析:从原理到实战应用

1. 质谱分析&#xff1a;从“称重”分子到解码物质世界在化学、生物、医药乃至环境科学领域&#xff0c;我们常常需要回答一个看似简单却至关重要的问题&#xff1a;这个东西到底是什么&#xff1f;它由什么组成&#xff1f;含量有多少&#xff1f;面对一瓶成分不明的液体、一块…...

量子计算核心原理、技术路线与应用场景全解析

1. 量子计算&#xff1a;一场颠覆性的计算范式革命量子计算&#xff0c;这个词在科技圈已经火了很久&#xff0c;但很多人对它的理解可能还停留在“比超级计算机快无数倍”的模糊印象里。作为一名长期关注前沿技术的从业者&#xff0c;我亲眼见证了它从实验室里高深莫测的理论&…...

面部SDF阴影锯齿问题的探索

近期做的一些工作涉及到面部SDF阴影&#xff0c;网上普遍做法是不做插值&#xff0c;直接Step硬性裁剪&#xff0c;不是很理解为什么不用插值&#xff0c;于是我通过SmoothStep做了简单修改&#xff0c;看下效果。 看上去还可以是因为gif有压缩&#xff0c;但面部SDF阴影做插值…...

量子Krylov子空间算法与经典阴影技术解析

1. 量子Krylov子空间算法原理与实现量子Krylov子空间算法是当前NISQ&#xff08;含噪声中等规模量子&#xff09;时代最具前景的量子-经典混合算法之一。其核心思想是通过构造一组Krylov基矢{|ψₖ⟩} {|ψ₀⟩, H|ψ₀⟩, H|ψ₀⟩,..., H^(d-1)|ψ₀⟩}&#xff0c;将高维希…...

魔兽争霸3终极兼容方案:5分钟解决Win10/Win11运行问题

魔兽争霸3终极兼容方案&#xff1a;5分钟解决Win10/Win11运行问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代Windows系统上…...

UDS_自动化脚本生成_10服务_V01

1、原子元素 1.1 会话原子 Session.Default() Session.Extended() Session.Programming() Session.Developer() 1.2 请求原子 10 01 10 02 10 03 10 76 10 81 10 82 10 83 10 F6 10 04 10 84 10 / 10 01 00 / 10 02 00 / 10 03 00 / 10 76 00 1.3 响应原子 50 01 00 32 01 F4 …...

AzurLaneAutoScript:碧蓝航线自动化管理的完整解决方案

AzurLaneAutoScript&#xff1a;碧蓝航线自动化管理的完整解决方案 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为碧…...

Cortex-M3 LOCKUP机制解析与嵌入式系统容错设计

1. Cortex-M3 LOCKUP机制解析LOCKUP是ARM Cortex-M3处理器中的一种特殊状态&#xff0c;当系统遇到无法恢复的严重错误时会进入该状态。理解LOCKUP机制对于嵌入式系统开发者至关重要&#xff0c;因为它直接关系到系统的可靠性和故障恢复能力。LOCKUP状态的核心特征是程序计数器…...

一文看懂 Hermes Agent 的 Prompt Builder:系统提示词到底拼进了什么?

一、先说结论&#xff1a;Prompt Builder 是 Hermes 的“提示词总装车间”普通 Chatbot 的系统提示词往往是一段固定文字&#xff0c;告诉模型“你是谁、怎么回答”。Hermes Agent 的 Prompt Builder 更像一条总装线&#xff1a;它会把身份、记忆、用户画像、项目规则、技能目录…...