Java--集合(理论)

news2025/2/12 10:13:06

目录

一、collection

collection常用方法

 1.List(可以存在重复元素)

迭代器

迭代器的概念

注意事项

例子 

1.ArrayList

特点

 2.LinkedLIst

特点

3.Vector

特点

2.Set(无重复元素)

1.HashSet

特点

2.Linkedhashset(应用不多)

特点

3.TreeSet

特点

小问题

⭐面试题⭐

== 和 equals 方法的区别? 

1. 基本概念

==

equals

2. 分场景分析

基本数据类型

引用类型


在Java中,集合主要分为两大体系:Collection&Map

集合这里经常和泛型一块用,在这里:Java详析--泛型-CSDN博客 + Java详解--泛型_java 抽象类范型属性-CSDN博客

泛型就是在集合中指定存储的数据类型,而且只能存储这种类型,在List<类型>必须要指定, ArrayList<>可以指定也可以不指定。注意:基本数据类不能作为泛型(但是基本类型的包装类可以用。)。

一、collection

其中collection在Java中的应用极为常见,大致分支图为:

collection常用方法

添加相关的方法

add(E e)   确保此 collection 包含指定的元素(可选操作)。

addAll(Collection<? extends E> c)  

将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。

删除相关的方法

clear()  移除此 collection 中的所有元素(可选操作)。

remove(Object o) 从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。

removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可选操作)。

判断相关的方法

contains(Object o) 如果此 collection 包含指定的元素,则返回 true

containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,则返回 true

isEmpty() 如果此 collection 不包含元素,则返回 true

数组的转换相关方法

toArray()  返回包含此 collection 中所有元素的数组。

 1.List(可以存在重复元素)

通过使用集合,ArrayList(应用最多)、Vector、LinkedList等三个继承list的类能够实现了动态扩容。

java.util.Collection
    └── java.util.List
        ├── java.util.ArrayList
        ├── java.util.Vector
        └── java.util.LinkedList

List集合的特点(list底层实现本质就是数组):

  1. 有序集合
  2. 元素可以重复(有索引,list本质靠索引区分而不是内容本身)
  3. 长度可变
  4. 底层实现为数组

迭代器

对于list的使用,collection常用使用方法几乎涵盖了,在此补充一个迭代器的概念:

 Iterator<E>

iterator() 返回在此 collection 的元素上进行迭代的迭代器。

迭代器的概念

迭代器(Iterator)是一种设计模式,在 Java 中是一个对象,它提供了一种统一的方式来访问集合中的元素,而不需要关心集合的具体实现细节。迭代器的主要作用是遍历集合中的元素,同时可以在遍历过程中进行一些操作,如删除元素等。 

Java 中的迭代器主要有两种:IteratorListIterator

  • Iterator是 Java 集合框架中最基本的迭代器接口,它可以用于遍历各种集合,如 ListSet 等。Iterator 提供了三个主要方法:

    • hasNext():判断集合中是否还有下一个元素。
    • next():返回集合中的下一个元素,并将迭代器的位置向后移动一位。
    • remove():删除迭代器最后返回的元素。
  • ListIteratorIterator 的子接口,专门用于遍历 List 集合。ListIterator 除了继承了 Iterator 的方法外,还提供了一些额外的方法,如:

    • hasPrevious():判断集合中是否还有上一个元素。
    • previous():返回集合中的上一个元素,并将迭代器的位置向前移动一位。
    • add(E e):在当前迭代位置插入一个元素。
    • set(E e):用指定元素替换迭代器最后返回的元素。
注意事项

在使用迭代器遍历集合时,如果需要修改集合的结构(如添加、删除元素),应该使用迭代器提供的方法(如 ListIteratoradd()remove() 方法),而不是直接调用集合的方法(如 Listadd()remove() 方法),否则可能会引发 ConcurrentModificationException 异常。

例子 

1.通过ListIterator的方式遍历:

ListIterator listIterator = list.listIterator();
while(listIterator.hasNext()){
    //获得迭代的元素
    String str = (String) listIterator.next();
    if("刘唐".equals(str)){
        //我们不能在一边遍历的时候一边操作集合,这样有多线程的并发问题
        //list.add("白胜");
        //迭代器可以给我们提供了一个add方法让我们避免并发问题,但是添加的时候本次遍历不生效
        listIterator.add("白胜"); //直接使用list的add方法就会造成count问题
    }
    System.out.println(str);

}
System.out.println(list);

2.for循环来动态的遍历List集合

System.out.println("---------------分割线   for循环遍历list-----------------------");
//int size = list.size();
//for循环对list的变量, 我们可以使用动态获得集合的长度的方式来遍历
for (int i = 0; i < list.size(); i++) {
    //根据索引来获得对应的元素
    String str  = (String) list.get(i);
    if("刘唐".equals(str)){
        list.add("阮小五");
    }
    System.out.println(str);
}

简单场景下,for循环的遍历方式完全能够替代迭代器。

1.ArrayList

ArrayList是List中应用最多的实现类。

特点

ArrayList的底层是数组的原理。

ArrayList中的元素是可以重复

是有序的集合,长度不固定。

不是线程安全的(适用于追求效率但是对线程安全度要求不那么高)。

效率高、性能好。

 2.LinkedLIst

特点

Linked也不是线程安全的。

  1. 底层结构是链表实现(对增删改更加友好)
  1. 适合做增删改的业务场景
  2. 线程不安全
  3. 有序集合但是更适合增删改

3.Vector

特点

Vector底层也是数组。

线程安全,支持多线程并发访问

可以存储任意类型对象,包括null

自定扩容,扩容机制是增量为当前容量的一半

2.Set(无重复元素)

Set同样是是Collection的子接口,具备无序性;而且Set是个接口,不能直接创建对象,需要实现类来创建对象

Set的实现类是HashSet(用的最多),linkedhashset, Treeset

1.HashSet

特点

1.元素唯一性

2.无序性

3.允许null存在一个(本质还是元素唯一性)

4.不是线程安全(效率高)

5,底层实现是数据结构是哈希表(哈希表依赖的两个方法:hashcode()和equals()方法)

(一般规则:对象的equals是true的话,hashcode需要相同,但是hashcode相同的对象不一定equals相同,这就是所谓的冲突现象,但是有不同的解决方法。你的hashCode()方法设计的好就会减少冲突。)

2.Linkedhashset(应用不多)

特点

1.元素唯一性

2.有序的

3.允许null存在一个

4.不是线程安全(效率高)

5,底层数据结构由链表和哈希表组成。

LinkedHashSet和HashSet来对比本质就是多了一个顺序。

3.TreeSet

类如果要实现比较的规则都会实现Comparable接口(所以创建几个类想填入TreeSet就要先行实现Comparable接口)。

特点

1.元素唯一性

2.可自定义排序的(两种  Comparable接口  自己定义比较类实现Comparator比较器接口)

3.不允许null存在

4.不是线程安全

5,treeset集合中的包装类都必须实现Comparable接口。

6,底层数据结构是红黑树。(是一种自平衡的二叉树)

小问题

工具类Arrays

数组的工具类,这里的方法都是静态的

1.把数组转换成字符串

2.对任意数组排序

3.对任意的数组做二分法的查找

4.把数组转换成List

工具类Collections

⭐面试题⭐

问:Collection和Collections的区别:

前者是集合的接口

后者操作集合的工具类

== 和 equals 方法的区别? 

1. 基本概念

==

== 是一个比较运算符,它的作用取决于操作数的类型:

  • 当操作数是基本数据类型时,== 比较的是它们的值是否相等。
  • 当操作数是引用类型时,== 比较的是两个引用是否指向内存中的同一个对象,即比较它们的内存地址是否相同。
equals

equalsObject 类中定义的一个方法,所有的类都继承自 Object 类,因此所有的对象都可以调用 equals 方法。在 Object 类中,equals 方法的默认实现和 == 是一样的,也是比较两个对象的内存地址是否相同。不过,很多类(如 StringInteger 等)会重写 equals 方法,用于比较对象的内容是否相等。

2. 分场景分析

基本数据类型

基本数据类型(如 intdoubleboolean 等)只能使用 == 进行比较,不能使用 equals 方法,因为基本数据类型不是对象,没有方法。

引用类型

引用类型既可以使用 == 也可以使用 equals 方法进行比较。

  • 使用 ==:比较的是两个引用是否指向同一个对象,即它们的内存地址是否相同。
public class ReferenceComparison {
    public static void main(String[] args) {
        String str1 = new String("hello");
        String str2 = new String("hello");
        // 使用 == 比较引用类型的内存地址
        boolean result1 = str1 == str2; 
        System.out.println(result1); // 输出: false

        String str3 = str1;
        boolean result2 = str1 == str3; 
        System.out.println(result2); // 输出: true
    }
}

/*
在这个例子中,str1 和 str2 虽然内容相同,
但它们是通过 new 关键字创建的两个不同的对象,
内存地址不同,所以 str1 == str2 的结果为 false。
而 str3 直接引用了 str1,它们指向同一个对象,
所以 str1 == str3 的结果为 true。

*/
  • 使用 equals:在 Object 类中,equals 方法的默认实现和 == 一样,比较的是对象的内存地址。但很多类会重写 equals 方法,用于比较对象的内容是否相等。

public class EqualsComparison {
    public static void main(String[] args) {
        String str1 = new String("hello");
        String str2 = new String("hello");
        // 使用 equals 比较引用类型的内容
        boolean result = str1.equals(str2); 
        System.out.println(result); // 输出: true
    }
}

/*
在这个例子中,String 类重写了 equals 方法,用于比较字符串的内容是否相等。
虽然 str1 和 str2 是两个不同的对象,
但它们的内容相同,所以 str1.equals(str2) 的结果为 true。

*/

综上所述,在比较基本数据类型时,只能使用 ==;在比较引用类型时,如果要比较对象的内存地址,使用 ==;如果要比较对象的内容,使用重写了 equals 方法的对象调用该方法。

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

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

相关文章

3D图形学与可视化大屏: 3D 图形学的定义、应用领域和发展历程

一、3D 图形学的定义 3D 图形学是计算机科学的一个分支&#xff0c;主要研究如何在计算机上生成、处理和显示三维图形。它涉及到数学、物理学、计算机科学等多个学科领域&#xff0c;旨在通过计算机技术模拟真实世界中的三维物体和场景&#xff0c;为用户提供逼真的视觉体验。…

Python 面向对象(类,对象,方法,属性,魔术方法)

前言&#xff1a;在讲面向对象之前&#xff0c;我们先将面向过程和面向对象进行一个简单的分析比较&#xff0c;这样我们可以更好的理解与区分&#xff0c;然后我们在详细的讲解面向对象的优势。 面向过程&#xff08;Procedure-Oriented Programming&#xff0c;POP&#xff0…

轮子项目--消息队列的实现(3)

上一篇文章中我把一些关键的类以及表示出来&#xff0c;如何对这些类对应的对象进行管理呢&#xff1f;管理分为硬盘和内存上&#xff0c;硬盘又分为数据库&#xff08;管理交换机&#xff0c;队列和绑定&#xff09;和文件&#xff08;管理消息&#xff09;&#xff0c;本文就…

5.7.1 软件项目管理范围、成本估算、风险分析

文章目录 管理范围成本估算风险分析 管理范围 软件项目管理范围包含4P&#xff0c;即人员、产品、过程、项目。人员管理通过人员能力成熟度模型PCMM进行管理。产品管理需要制定产品目标&#xff0c;识别产品的总体目标&#xff0c;而不涉及细枝末节。产品范围&#xff0c;识别产…

Android新版高斯模糊(毛玻璃)官方实现,Kotlin

Android新版高斯模糊(毛玻璃)官方实现&#xff0c;Kotlin 从Android 12开始&#xff0c;Android官方API支持高斯模糊(毛玻璃)效果。关键是通过RenderEffect实现。 https://developer.android.com/reference/android/graphics/RenderEffecthttps://developer.android.com/refer…

仿 RabbitMQ 实现的简易消息队列

文章目录 项目介绍开放环境第三⽅库介绍ProtobufMuduo库 需求分析核⼼概念实现内容 消息队列系统整体框架服务端模块数据管理模块虚拟机数据管理模块交换路由模块消费者管理模块信道&#xff08;通信通道&#xff09;管理模块连接管理模块 客户端模块 公共模块日志类其他工具类…

实验9 基于WebGoat平台的SQL注入攻击

实验9 基于WebGoat平台的SQL注入攻击 1.实验目的 熟悉WebGoat平台&#xff0c;在该平台上实现SQL注入攻击。 2.实验内容 &#xff08;1&#xff09;下载webgoat-server-8.2.2.jar。 &#xff08;2&#xff09;搭建java环境。 &#xff08;3&#xff09;运行webgoat。 &#xf…

多光谱技术在华为手机上的应用发展历史

2018 年&#xff0c;华为 P20 系列首次搭载 5 通道色温传感器&#xff0c;可帮助手机在不同光照条件下保持画面色彩一致性。 2020 年&#xff0c;华为 P40 系列搭载 8 通道多光谱色温传感器&#xff08;实际为 11 通道&#xff0c;当时只用 8 个通道检测可见光&#xff09;&am…

如何免费白嫖 Deepseek API 接口

今天我将教大家如何利用网络空间测绘搜索引擎「Fofa」来寻找已经部署并开放 Deepseek 接口的服务。以下是详细步骤&#xff1a; 1. 访问 Fofa 搜索引擎 首先&#xff0c;打开 Fofa 搜索引擎的网站&#xff1a;https://fofa.info 2. 搜索开放的 Deepseek 接口 在搜索框中输入…

SaaS+AI应用架构:业务场景、智能体、大模型、知识库、传统工具系统

SaaSAI应用架构&#xff1a;业务场景、智能体、大模型、知识库、传统工具系统 大家好&#xff0c;我是汤师爷~ 在SaaS与AI应用的演进过程中&#xff0c;合理的架构设计至关重要。本节将详细介绍其五个核心层次&#xff1a; 业务场景层&#xff1a;发现和确定业务场景智能体层…

ios通过xib创建控件

之前写过ios动态创建控件及添加事件&#xff0c;纯手工代码写控件&#xff0c;虽然比较灵活&#xff0c;但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成 1.创建AppView.xib 2.再创建xib对应的mode&#xff0…

【树莓派Pico设备驱动】-WS2812B全彩LED驱动(基于SPI)

WS2812B全彩LED驱动(基于SPI) 文章目录 WS2812B全彩LED驱动(基于SPI)1、WS2812介绍2、WS2812配置4、驱动实现1、WS2812介绍 WS2812/WS2812B LED 使用 24 位来表示绿色、红色和蓝色值。 WS2812采用单线通信的设计,通信协议为非归零编码,每个LED需要24个bit的数据,数据依…

AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…

2025届优秀创新大数据毕业设计

吊打导师的大数据毕业设计项目 985华南理工大学学长 大厂全栈&#xff0c;大数据开发工程师 专注定制化开发

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题

解决 ComfyUI-Impact-Pack 中缺少 UltralyticsDetectorProvider 节点的问题 1. 安装ComfyUI-Impact-Pack 首先确保ComfyUI-Impact-Pack 已经下载 地址: https://github.com/ltdrdata/ComfyUI-Impact-Pack 2. 安装ComfyUI-Impact-Subpack 由于新版本的Impact Pack 不再提供这…

SpringBoot中的Javaconfig

为什么要使用Javaconfig&#xff1f; 如果要声明的bean对象&#xff0c;来自于第三方jar包&#xff08;不是自定义的&#xff09;&#xff0c;无法使用Component 及衍生注解来声明bean&#xff0c;因为第三方的jar一般不可写&#xff0c;需要使用注解Configuration和Bean注解来…

【前端】几种常见的跨域解决方案代理的概念

几种常见的跨域解决方案&代理的概念 一、常见的跨域解决方案1. 服务端配置CORS&#xff08;Cross-Origin Resource Sharing&#xff09;&#xff1a;2. Nginx代理3. Vue CLI配置代理&#xff1a;4 .uni-app在manifest.json中配置代理来解决&#xff1a;5. 使用WebSocket通讯…

Windows11+PyCharm利用MMSegmentation训练自己的数据集保姆级教程

系统版本&#xff1a;Windows 11 依赖环境&#xff1a;Anaconda3 运行软件&#xff1a;PyCharm 一.环境配置 通过Anaconda Prompt(anaconda)打开终端创建一个虚拟环境 conda create --name mmseg python3.93.激活虚拟环境 conda activate mmseg 4.安装pytorch和cuda tor…

基于java手机销售网站设计和实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

如何评估云原生GenAI应用开发中的安全风险(下)

以上就是如何评估云原生GenAI应用开发中的安全风险系列中的上篇内容&#xff0c;在本篇中我们介绍了在云原生AI应用开发中不同层级的风险&#xff0c;并了解了如何定义AI系统的风险。在本系列下篇中我们会继续探索我们为我们的云原生AI应用评估风险的背景和意义&#xff0c;并且…