集合注意事项

目录

我们为什么要用到集合中的迭代器

List实现类的循环遍历

Set集合

HashSet

TreeSet

Map

Hashmap

Treemap

Hashtable

map的遍历方式

Collections的一些静态方法


我们为什么要用到集合中的迭代器

List实现类的循环遍历

如图我们对arraylist中加入了三个相同的“a”时,使用for循环遍历删除会发现有漏网之鱼,为什么会出现这种现象呢?因为集合arraylist在删除时不会和数组一样不动,而是将后面的元素全部向前移动,这导致了i++之后变成了1删除了【a,a】删除了第三个"a",但是第二个“a”被保留了下来.

如图我们使用了增强for循环,这时对for循环的一种包装,我们在使用时会出现异常报错,在使用增强for循环时不可以进行增添或删除,所以我们不能用增强for循环。

如图我们可以显而易见的看到使用迭代器的方法将“a”全部删除了,这主要是由于迭代器内部有一个cursor(指针)从0开始遇到next()自动加一 遇到remove()自动减一,简而言之就是拿到先拿到第0个元素,然后指针向后移动一个,如果remove()则删除第0个元素,指针减一.可以debug试试.

以上三个图就是为什么使用迭代器的原因。

这是list迭代器 在arraylist linklist vector才可以用 功能更加丰富.

Set集合

Set接口:不重复元素、无索引

List接口:可重复、有索引(linklist也有存在node里了

HashSet

hashset:哈希无序.

如何判断hashset中元素重复?

答:可以用equals来判断元素是否重复,但是equals底层实现在String类中是通过一个字符一个字符比较的这样的方法太慢了.所以我们在添加元素时底层会用hashCode()和equals()两种方法,先通过哈希值比较是否相等,用hash值比较时速度是很快,但是hash值是不安全不可靠的(有可能内容不同但是hash值相同),所以我们先判断哈希值是否相等,如果不相等直接pass,如果相等则为了安全考虑在使用equals()来逐个比较.既提高了效率又保证了安全.

如果将学生对象存储到hashSet中又该如何判断呢?

根据上一问的回答可知我们先判断hashCode()是否相等,hashCode()是Object类中定义的方法,所以创建的student类默认是具有hashCode()方法,但是Object中的hashCode()方法是返回内存地址如果通过new创建一个对象的话,则不管内容如何他们的内存地址都不相同。所以我们需要重写hashcode()方法和equals()方法。注意:从源码中可以得知时第二条重复数据将第一条数据覆盖了,而不是没添加进来.

重写hashcode和equals方法

结果显示则只有一条101 张三.

TreeSet

底层是树型结构,添加进来的元素可以排序(有序的,不是添加顺序,是元素的自然顺序)

我们如果使用普通的二叉树存储的话,遇到数据递增的情况则会出现如下图

这和链表就没什么区别了,我们用二叉树主要是能降低高度查找更快。

所以底层一般使用红黑树,递增是会进行旋转.

hashset中又是如何实现自然排序的呢?

答:和hashset的逻辑一样,不过是需要实现Comparable接口并重写compareTo()方法比较.

如果compareTo()的返回值为0则表示相等不会再添加对象到集合中去.

注意Comparable<Student>这个泛型要写,不然comparaTo方法中的参数类型就是Object类型还要向下转型。

Map

Hashmap

hashmap:无序 键不同(后键覆盖前键) 值可以相同 

hashset底层用的就是new hashmap()将值put( value,默认值)放到key列里面。

hashmap中有 map.values()方法拿到所有的value返回一个Collection<>中,也又keySet()方法拿到所有key放到Set<>集合中。

Hashmap底层的三种结构:

1.hash数组(锁定元素位置node<k,v>[ ])扩容为原来的2倍,阈值为0.75(数组被使用到0.75时就会扩容)

2.链表(存储多个元素node(key,val)) 

3.红黑树(存储多个元素)

添加元素时,先计算元素hash值%数组长度(实际源码中时按位与hash值)得到元素位置,我们在存储时在同一个位置上使用链表的长度过长时(源码中长度>=8时且源码中想要创建红黑树还有一个条件是数组的长度需要大于等于64否则resize()对数组扩容会打乱原有链表排序)查询效率降低,这时我们将链表变为红黑树来提高查询效率。

这个图是我用smileNicky这个博主的图片 在扩容时的机制,源码也是这个意思.

Treemap

Treemap中的key 需要又comparable接口实现comparaTo方法

总的来说Tree和hash去重一个是compara去重一个是hashcode加equals去重

Hashtable

和hashmap底层相同 但是线程安全

和hashmap相比key不能为null,value也不能为null。

map的遍历方式

方式一:使用keyset集合拿到key值 增强for循环或者用迭代器遍历都可以

第二种也是map遍历最常用的方法可以拿到key也可以拿到value

entry是我们在用map中的一个内部类添加元素时维护的将键值对放到entry里面更方便遍历.

Collections的一些静态方法

类型.....参数名,可变长度参数,例如test(1,2,3,4) public static void test(int....a).

一个参数列表中只能有一个可变长度参数,而且必须放到末尾(int a,int....b)

Collections.addAll(arraylist,3,4,5,6)把3 4 5 6添加到arralist中

Collections.sort(arraylist)对集合进行排序

Collections.binarySearch(arraylist,1)排序后进行二分查找法找值

Collections.swap(arraylist,0,4)把第0个位置和第四个位置交换

Collections.copy(arraylist,arraylist1)把后面的集合元素复制到前面,前提是前面的集合长度必须大于后面,会把相同位置的元素覆盖成arraylist1中的元素.

Collections.fill(arraylist,0)将0填满数组

Collections.reverse(arraylist)逆序,也可以用迭代器ListIterator每次打印上一个元素

Collections.shuffle(arraylist)随即打乱集合

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

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

相关文章

多路h265监控录放开发-(8)通过XCameraWIget类拖拽实现指定播放rtsp和窗口

首先修改xviewer的构造函数&#xff0c;把创建QWiget对象改为XCameraWiget对象&#xff0c;执行XCameraWiget类的构造函数 xcamera_widget.h #pragma once #include <QWidget> class XCameraWidget :public QWidget {Q_OBJECTpublic:XCameraWidget(QWidget* p nullptr)…

网络安全:Web 安全 面试题.(SQL注入)

网络安全&#xff1a;Web 安全 面试题.&#xff08;SQL注入&#xff09; 网络安全面试是指在招聘过程中,面试官会针对应聘者的网络安全相关知识和技能进行评估和考察。这种面试通常包括以下几个方面&#xff1a; &#xff08;1&#xff09;基础知识:包括网络基础知识、操作系…

容器之事件盒

代码&#xff1a; #include <gtk-2.0/gtk/gtk.h> #include <glib-2.0/glib.h> #include <gtk-2.0/gdk/gdkkeysyms.h> #include <stdio.h>static void label_const(GtkWidget *eventbox) {static int i 0;static char citem[100];sprintf(citem, &quo…

【Unity学习笔记】第十八 基于物理引擎的日月地系统简单实现

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/139701843 作者&#xff1a;CSDN|Ringleader| 目录 目标数学理论资源准备数据准备代码实现Unity准备效果展示注意事项后记 目标 目标&#xff1a;利用Unity的物理引擎实现 “日地月三体系统” 。 效果…

PHP转Go系列 | ThinkPHP与Gin的使用姿势

大家好&#xff0c;我是码农先森。 安装 使用 composer 进行项目的创建。 composer create-project topthink/think thinkphp_demo使用 go mod 初始化项目。 go mod init gin_demo目录 thinkphp_demo 项目目录结构。 thinkphp_demo ├── LICENSE.txt ├── README.md …

【干货】微信小程序免费开源项目合集

前言 2024年了&#xff0c;还有小伙伴在问微信小程序要怎么开发&#xff0c;有什么好的推荐学习项目可以参考的。今天分享一个收集了一系列在微信小程序开发中有用的工具、库、插件和资源&#xff1a;awesome-github-wechat-weapp。 开源项目介绍 它提供了丰富的资源列表&…

day01-Numpy的安装

numpy的安装 同样&#xff0c;anaconda内置有Numpy包 Numpy是用c语言实现的&#xff0c;运算速度比python快得多 import numpy as np np.__version__out: 1.18.5使用Jupyter编辑器打印numpy包的版本 NumPy ndarray对象 NumPy定义了一个n维数组对象&#xff0c;简称ndarra…

js浅拷贝和深拷贝的区别

JavaScript中的浅拷贝和深拷贝的主要区别在于它们如何处理引用类型的数据。 浅拷贝仅复制对象的引用&#xff0c;而不复制对象本身。这意味着新旧对象共享同一块内存空间。因此&#xff0c;如果修改了原始对象&#xff0c;复制的对象也会相应地改变&#xff0c;因为它们实际上是…

利用LabVIEW和机器学习实现无规律物体识别

针对变化无规律的物体识别&#xff0c;LabVIEW结合机器学习算法提供了一种高效的解决方案。介绍如何使用LabVIEW编程实现此功能&#xff0c;包括所需工具包、算法选择和实现步骤&#xff0c;帮助开发者在无规律的复杂环境中实现高精度的物体识别。 1. 项目概述 无规律物体的识…

诺瓦星云入职认知能力SHL测验Verify职业性格问卷OPQ可搜索带解析求职题库

欢迎您开启诺瓦星云的求职旅程 恭喜您进入测评环节&#xff0c;接下来您需要作答两个测验&#xff0c;分别是职业性格问卷OPQ和认知能力测验Verify&#xff0c;总共用时大约1小时&#xff0c;祝您作答顺利! 【华东同舟求职】由资深各行业从业者建立的一站式人才服务网络平台&a…

Day1:二分查找704 移除元素27

题目链接704. 二分查找 - 力扣&#xff08;LeetCode&#xff09; int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;int mid (right - left) / 2;while (left < right){if (target nums[mid]){return mid;}else if (target …

docker换源

文章目录 前言1. 查找可用的镜像源2. 配置 Docker 镜像源3. 重启 Docker 服务4. 查看dock info是否修改成功5. 验证镜像源是否更换成功注意事项 前言 在pull镜像时遇到如下报错&#xff1a; ┌──(root㉿kali)-[/home/longl] └─# docker pull hello-world Using default …

力扣372. 超级次方

Problem: 372. 超级次方 文章目录 题目描述思路复杂度Code 题目描述 思路 1.处理数组指数&#xff1a;如下图可以将其转换为一个递归的操作 2.处理 mod 运算:对于模运算我们有公式&#xff1a; ( a b ) % k ( a % k ) ( b % k ) % k (a \times b) \% k (a \% k) \times (b…

Zookeeper原理

Zookeeper监听原理 监听原理详解 &#xff08;1&#xff09;首先要有一个main()线程 &#xff08;2&#xff09;在main线程中创建Zookeeper客户端&#xff0c;这时就会创建两个线程&#xff0c;一个负责网络连接通信(connet)&#xff0c;一个负责监听(listener) 。 &#xf…

2.XSS-存储型

储存型XSS 或持久型 XSS 交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。 在留言板里面进行测试一下是否有做过滤 "<>?&66666点击提交 查看元素代码&#xff0c;已经提交完成&#xff0c;并且没有做任何的过滤措施 接下来写一个javascrip…

软件工程学系统设计

一、概述 软件设计阶段用比较抽象概括的方式确定目标系统如何完成预定的任务&#xff0c;即确定系统的物理模型。 回答系统 “做什么”。 软件设计是将需求转化为最终产品的唯一途径&#xff0c;是后续开发和维护工作的基础。 1、软件设计过程 从工程管理角度&#xff0c;…

AI网络爬虫:用deepseek批量提取gptstore.ai上的gpts数据

网站首页&#xff1a;https://gptstore.ai/gpts/categories/finance 翻页规律如下&#xff1a; https://gptstore.ai/_next/data/S9vKNrHo4K82xWjuXpw-O/en/gpts/categories/finance.json?slugfinance&page2 https://gptstore.ai/_next/data/S9vKNrHo4K82xWjuXpw-O/en/g…

Python | Leetcode Python题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; class Solution:def trailingZeroes(self, n: int) -> int:ans 0while n:n // 5ans nreturn ans

【六】【QT开发应用】信号和信号槽的五种写法

第一种写法 第二种写法 第三种写法 第四种写法 第五种写法 完整代码 mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow …

Golang | Leetcode Golang题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; func trailingZeroes(n int) (ans int) {for n > 0 {n / 5ans n}return }