Java--集合(理论)

目录

一、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 方法的对象调用该方法。

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

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

相关文章

三相绕线型异步电动机转子串电阻器起动的建模仿真

1.引言 2.起动方法与原理 3. 起动器的分级电阻计算 4. 起动时间计算 5.三相异步电动机瞬态数学模型 6. 三相绕线型异步电动机转子串电阻器系统仿真模型 7.实例仿真分析 8.总结 1.引言 三相绕线型异步电动机转子串电阻器起动的研究文章有很多很多&#xff0c;但大多数都不…

用Python编写经典《贪吃蛇》小游戏

文章目录 环境准备依赖库 实现思路核心模块设计 代码框架运行效果优化建议总结通过本框架可实现基础版贪吃蛇游戏&#xff0c;关键点在于&#xff1a;典型问题解决方案&#xff1a; 环境准备 依赖库 主要依赖 Python 3.6pygame 2.1.2 # 用于图形界面渲染 安装命令 pip ins…

防洪先锋,应急防洪墙助力灾害应急响应|深圳鼎跃

在全球极端天气频发的背景下&#xff0c;洪涝灾害日益成为威胁人类安全的重要因素。传统的防洪措施如堤坝、沙袋虽有一定效果&#xff0c;但在突发性洪水面前往往难以迅速部署。 应急防洪墙是一种模块化、可移动的临时防洪结构&#xff0c;通过拼插、折叠或液压驱动快速形成刚性…

从Word里面用VBA调用NVIDIA的免费DeepSeekR1

看上去能用而已。 选中的文字作为输入&#xff0c;运行对应的宏即可&#xff1b;会先MSGBOX提示一下&#xff0c;然后相关内容追加到word文档中。 需要自己注册生成好用的apikey Option ExplicitSub DeepSeek()Dim selectedText As StringDim apiKey As StringDim response A…

高通android WIFI debug

参考高通文档&#xff1a;80-76240-16_REV_AA_Wi-Fi_Debug_Techniques 大纲 一、 WLAN Debug Logs –logcat ■ Logcat log logcat is a command-line tool that dumps the log of system messages, ■ Including stack traces when the device throws an error. ■ Need t…

Python:凯撒密码

题目内容&#xff1a; 凯撒密码是古罗马恺撒大帝用来对军事情报进行加密的算法&#xff0c;它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列该字符后面第三个字符&#xff0c;对应关系如下&#xff1a; 原文&#xff1a;A B C D E F G H I J K L M N O P Q R …

基于STM32的智能鱼缸水质净化系统设计

&#x1f91e;&#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是智能鱼缸水质净化系统。 目录 1、设计要求 2、系统功能 3、演示视频和实物 4、系统设计框图 5、软件设计流程图 6、原理图 7、主程序 8、总结 1、设计要求…

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射&#xff08;特殊的存储器&#xff09;2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…

美甲美睫门店拓客营销小程序开发

一套针对美甲美睫门店开发的营销拓客小程序 小程序支持线上线下服务预约、客户管理、多种客户营销方式以及员工管理、门店管理、门店营销活动创建开展等等。 用户端&#xff1a;服务预约、次卡、时卡办理&#xff0c;会员办理、会员升级、会员权益&#xff0c;复购攒积分&…

deepseek+“D-id”或“即梦AI”快速生成短视频

1、deepseek生成视频脚本 1.1、第一步&#xff1a;使用通用模板提出需求&#xff0c;生成视频脚本 对话输入示例脚本1&#xff1a; 大年初五是迎财神的日志&#xff0c;帮我生成10秒左右的短视频&#xff0c; 体现一家3口在院子里欢庆新年&#xff0c; 孩子在院子里放鞭炮烟…

【STM32】ADC|多通道ADC采集

本次实现的是ADC实现数字信号与模拟信号的转化&#xff0c;数字信号时不连续的&#xff0c;模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法&#xff0c;使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时&#xff0c;0~ 3.3v(模拟信…

从零到一:基于Rook构建云原生Ceph存储的全面指南(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1&#xff09;Rook Operator2&#xff09;Rook Discover3&#xff09;Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…

如何在本地部署deepseek?

1、打开ollama官网&#xff0c;点download&#xff08;下载需要翻墙 https://ollama.com/ 2、双击下载好的OllamaSetup.exe&#xff0c;一直点下一步即可。 3、winR 输入cmd&#xff0c;打开命令提示符&#xff0c;输入ollama。有以下提示即安装完成。 4、可以根据 nvidia-…

团结引擎 OpenHarmony 平台全面支持 UAAL,实现引擎能力嵌入原生应用

团结引擎1.4版本已于近日正式发布&#xff01;在这一版本中&#xff0c;OpenHarmony 平台迎来了一个具有里程碑意义的更新&#xff1a;全面支持 Used as a Library&#xff08;UAAL&#xff09;。UAAL 这一技术方案&#xff0c;具有将引擎嵌入原生应用的独特能力&#xff0c;其…

【DeepSeek】在本地计算机上部署DeepSeek-R1大模型实战(完整版)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能&#xff08;AI&#xff09;通过算法模拟人类智能&#xff0c;利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络&#xff08;如ChatGPT&…

【Elasticsearch】Elasticsearch检索方式全解析:从基础到实战(二)

接着上一篇文章&#xff1b;我们继续来研究es的复杂检索 文章目录 (1) bool用来做复合查询&#xff08;2&#xff09;Filter【结果过滤】&#xff08;3&#xff09;term&#xff08;4&#xff09;Aggregation&#xff08;执行聚合&#xff09; (1) bool用来做复合查询 复合语…

如何使用DiskGenius做备份并且恢复?

如何使用DiskGenius做备份并且恢复&#xff1f; 前言 前言 此操作适用于将1台旧电脑的数据迁移到新电脑上 一、进入PE使用DG分区进行备份镜像 二、分区备份 1选择要操作的硬盘——2选择操作分区——3备份分区 1选择文件路径&#xff08;保存pmf文件的位置选择存到U盘中&…

ZZNUOJ(C/C++)基础练习1091——1100(详解版)⭐

目录 1091 : 童年生活二三事&#xff08;多实例测试&#xff09; C C 1092 : 素数表(函数专题&#xff09; C C 1093 : 验证哥德巴赫猜想&#xff08;函数专题&#xff09; C C 1094 : 统计元音&#xff08;函数专题&#xff09; C C 1095 : 时间间隔&#xff08;多…

【Spring AI】基于SpringAI+Vue3+ElementPlus的QA系统实现一

整理不易&#xff0c;请不要吝啬你的赞和收藏。 1. 前言 这是 SpringAI 系列的第二篇文章&#xff0c;这篇文章将介绍如何基于 RAG 技术&#xff0c;使用 SpringAI Vue3 ElementPlus 实现一个 Q&A 系统。本文使用 deepseek 的 DeepSeek-V3 作为聊天模型&#xff0c;使用…