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); // 输出: falseString 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.mzph.cn/diannao/69793.shtml

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

相关文章

C语言基础13:循环结构 for和while

循环结构 什么是循环结构 代码在满足某种条件的前提下&#xff0c;重复执行&#xff0c;就叫做循环结构。 循环的分类 无限循环&#xff1a;其实就是死循环&#xff0c;程序设计中尽量避免无限循环&#xff0c;如果非要使用&#xff0c;那么这个循环一定要在可控范围内。有…

C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现

文章目录 一、std::gcd 的基本用法&#xff08;一&#xff09;包含头文件&#xff08;二&#xff09;函数签名&#xff08;三&#xff09;使用示例 二、std::gcd 的实现原理三、std::gcd 的优势&#xff08;一&#xff09;简洁易用&#xff08;二&#xff09;类型安全&#xff…

vue项目网页图标修改

参考:https://blog.csdn.net/qq_53911056/article/details/144744699 在Vue项目中修改网页图标&#xff08;favicon&#xff09;是一个相对简单的过程。以下是详细的步骤&#xff1a; 准备新的图标文件 准备一个新的图标文件&#xff08;通常是 .ico 格式&#xff0c;但也支持其…

资料搜集-内存屏障

0. 引用 内存屏障详解-CSDN博客 为什么需要内存屏障&#xff1f;_mesi 内存屏障-CSDN博客 内存屏障与CPU优化&#xff1a;理解多核系统中的数据一致性-CSDN博客 内存屏障今生之Store Buffer, Invalid Queue_storebuffer-CSDN博客 内存屏障&#xff08;Memory Barrier&…

【Java八股文】01-Java基础面试篇

【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象&#xff0c;什么是封装继承多态&#xff1f;多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…

线程池-抢票系统性能优化

文章目录 引言-购票系统线程池购票系统-线程池优化 池化 vs 未池化 引言-购票系统 public class App implements Runnable {private static int tickets 100;private static int users 10000;private final ReentrantLock lock new ReentrantLock(true);public void run() …

【多模态大模型】系列1:Transformer Encoder——ViLT、ALBEF、VLMO

目录 1 ViLT2 ALBEF3 VLMO 1 ViLT ViLT: Vision-and-Language Transformer Without Convolution or Region Supervision 图文多模态任务&#xff0c;关键是提取视觉特征和文本特征&#xff0c;然后对齐。在之前的多模态研究工作中&#xff0c;视觉侧通常需要一个目标检测器来…

百度 API 教程 001:显示地图并添加控件

目录 01、基本使用 前期准备 显示地图 开启鼠标滚轮缩放地图 02、添加地图控件 添加标准地图控件 添加多个控件 网址&#xff1a;地图 JS API | 百度地图API SDK 01、基本使用 前期准备 注册百度账号 申请成为开发者 获取密钥&#xff1a;控制台 | 百度地图开放平台…

电容器教程摘要

正如我们将在本电容器教程中看到的那样&#xff0c;电容器是能够在其板上存储电荷的能源。因此&#xff0c;电容器由于存储充电的能力而存储能量&#xff0c;理想的电容器不会松散其存储的能量。 电容器的简单结构是使用两个平行的导电金属板通过绝缘材料通过距离分开。这种绝…

【通俗易懂说模型】一篇弄懂几个经典CNN图像模型(AlexNet、VGGNet、ResNet)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;深度学习_十二月的猫的博客-CSDN博客 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…

汇编简介常用语法

为什么要有汇编 因为Cortex-A芯片一上电SP指针还没初始化&#xff0c;C环境还没准备 好&#xff0c;所以肯定不能运行C代码&#xff0c;必须先用汇编语言设置好C环境&#xff0c;比如初始化DDR、设置SP 指针等等&#xff0c;当汇编把C环境设置好了以后才可以运行C代码 GNU语法…

内网ip网段记录

1.介绍 常见的内网IP段有&#xff1a; A类&#xff1a; 10.0.0.0/8 大型企业内部网络&#xff08;如 AWS、阿里云&#xff09; 10.0.0.0 - 10.255.255.255 B类&#xff1a;172.16.0.0/12 中型企业、学校 172.16.0.0 - 172.31.255.255 C类&#xff1a;192.168.0.0/16 家庭…

ComfyUI流程图生图原理详解

一、引言 ComfyUI 是一款功能强大的工具&#xff0c;在图像生成等领域有着广泛应用。本文补充一点ComfyUI 的安装与配置过程遇到的问题&#xff0c;并深入剖析图生图过程及相关参数&#xff0c;帮助读者快速入门并深入理解其原理。 二、ComfyUI 的安装与配置中遇到的问题 &a…

无人机遥感图像拼接及处理实践技术:生态环境监测、农业、林业等领域,结合图像拼接与处理技术,能够帮助我们更高效地进行地表空间要素的动态监测与分析

近年来&#xff0c;无人机技术在遥感领域的应用越来越广泛&#xff0c;尤其是在生态环境监测、农业、林业等领域&#xff0c;无人机遥感图像的处理与分析成为了科研和业务化工作中的重要环节。通过无人机获取的高分辨率影像数据&#xff0c;结合图像拼接与处理技术&#xff0c;…

web渗透测试之反弹shell SSRF结合redis结合伪协议 redis 未授权访问漏洞

目录 未授权访问漏洞利用:redis 反弹shell 漏洞原因就是&#xff1a; 反弹shell利用方式 反弹shell指的是什么 : 反弹shell的前提条件 步骤: redis未授权访问的三种利用手段反弹shell 利用定时任务反弹shell 攻击主机下设置 写入 webshell 步骤 利用公钥认证写入ro…

【Vue】打包vue3+vite项目发布到github page的完整过程

文章目录 第一步&#xff1a;打包第二步&#xff1a;github仓库设置第三步&#xff1a;安装插件gh-pages第四步&#xff1a;两个配置第五步&#xff1a;上传github其他问题1. 路由2.待补充 参考文章&#xff1a; 环境&#xff1a; vue3vite windows11&#xff08;使用终端即可&…

Win32/C++ 字符串操作实用工具

CStrUtils.h #pragma once#include <string> #include <vector> #include <windows.h> #include <tchar.h>#ifdef _UNICODE using _tstring std::wstring; #else using _tstring std::string; #endif// 字符串转换实用工具 namespace CStrUtils {//…

【C++前缀和】1074. 元素和为目标值的子矩阵数量|2189

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 LeetCode1074. 元素和为目标值的子矩阵数量 给出矩阵 matrix 和目标值 target&#xff0c;返回元素总和等于目标值的非空子矩阵的数量。 子矩阵 x1, y1, x2, y2 是满…

【安当产品应用案例100集】037-强化OpenVPN安全防线的卓越之选——安当ASP身份认证系统

在当前数字化时代&#xff0c;网络安全已成为企业发展的重要组成部分。对于使用OpenVPN的企业而言&#xff0c;确保远程访问的安全性尤为重要。安当ASP身份认证系统凭借其强大的功能和便捷的集成方式&#xff0c;为OpenVPN的二次登录认证提供了理想的解决方案&#xff0c;特别是…