java——Collection、Map 深度理解

news2024/12/23 10:12:28

在这里插入图片描述

Collection <类型>🍉

List(Conllection的实现类) 可以重复,有顺序 可存放多个null值🥝

ArrayList 主选 🍓

结构:数组
特点:查找快,增删慢
线程不安全,效率高

Vector🍓

结构:数组
特点:查找快,增删慢
synchronized实现线程安全,效率低

Stack

结构:栈
特点:Vector的子类,也定义了自己的一些方法。
synchronized实现线程安全,效率低

LinkedList🍓

结构:链表
特点:查找慢,增删快
线程不安全,效率低

boolean add(E o) 向列表的尾部追加指定的元素
 
void add(int index,E element) 在列表的指定位置插入指定元素。
 
boolean addAll(Collection<? extends E> c) 追加指定 collection中的所有元素到此列表的结尾,顺序是指定collection的迭代器返回这些元素的顺序。
 
boolean addAll(int index,Collection<? extends E> c) 将指定collection中的所有元素都插入到列表中的指定位置。
 
void clear() 从列表中移除所有元素。
 
boolean contains(Object o) 如果列表包含指定的元素,则返回trueboolean containsAll(Collection<?> c) 如果列表包含指定collection的所有元素,则返回trueboolean equals(Object c) 比较指定的对象与列表是否相等。
 
E get(int index) 返回列表中指定位置的元素。
 
int hashCode() 返回列表的哈希码值。
 
int indexOf(Object o) 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回-1boolean isEmpty() 判断集合是否为空 如果为空 则返回true,否则返回false
 
Iterator<E> iterator() 返回以正确顺序在列表的元素上进行迭代的迭代器。
 
int lastIndexOf(Object o) 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回-1ListIterator<E> listIterator() 返回列表中元素的列表迭代器(以正确的顺序)。
 
ListIterator<E> listIterator(int index)返回列表中元素的列表迭代器(以正确的顺序),从列表的指定位置开始。
 
E remove(int index) 移除列表中指定位置的元素。
 
boolean remove(Object o) 移除列表中出现的首个指定元素。
 
boolean removeAll(Collection<?> c) 从列表中移除指定collection中包含的所有元素。
 
boolean retainAll(Collection<?> c)仅在列表中保留指定collection中所包含的元素。
 
E set(int index,E element) 用指定元素替换列表中指定位置的元素。
 
int size() 返回列表中的元素数。
 
List<E> subList(int forIndex,int toIndex) 返回列表中指定的formIndex(包括)toIndex(不包括)之间的部分视图。
 
Object toArray() 返回以正确顺序包含列表中的所有元素的数组。

Set(Conllection的实现类) 唯一性,没有顺序 只可存放一个null值🥝

HashSet 🍓

结构:哈希表
通过hashCode()、equals()保证元素的唯一性
元素的排列是无序的 线程不安全
基于 HashMap 实现的,HashSet 底层使用 HashMap 来保存所有元素

LinkedHashSet

结构:链表+哈希表
与HashSet相比,由链表保证元素有序
线程不安全

TreeSet

结构:红黑树
排序方法有自然排序、比较器排序
唯一性通过存放值时比较返回值是否为0,0既有相同值
线程不安全

TreeSet实现了对TreeMap的封装

实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆

Hash值冲突🍉

hash值冲突是发生在put()时,hash值是通过hash(key.hashCode())来获取的,因为hashCode是int类型,所以最多只能说2^32个,当put的元素越来越多时,出现不同的key产生相同的hash值问题,也即是hash冲突。

分离链表法🥝

对于相同的哈希值,使用链表进行连接。使用数组存储每一个链表。

put的时候地址上存在value,则再对比key是否相同,若hash值和key都相同,则替换value,若hash值相同,key不相同,则形成一个单链表,将hash值相同,key不同的元素以Entry<V,V>的方式存放在链表中,这样就解决了hash冲突。

开放地址方法🥝

按顺序决定哈希值时,如果某数据的哈希值已经存在,则在原来哈希值的基础上往后加一个单位,直至不发生哈希冲突。

equals 和 hashCode区别:🥝

  • 在Object类中,hashCode是一个本地方法简单理解为获取对象地址,equals方法比较自己和obj对象地址是否相 等。在这里一定先认识到这两个方法,一个是取地址,一个是比较地址。equals()和hashCode()都不是final方法。

  • hashCode()是一个native方法,而且返回值类型是整形;该native方法将对象在内存中的地址作为哈希码返回,可以保证不超出整形范围的情况下不同对象的返回值不同。

  • 当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。如果该位置没有对象,可以直接将object插入该位置;如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object是否相等,如果相等,则不需要保存object;如果不相等,则将该对象加入到链表中。

注:当我们把自定义类作为Map的Key的时候,需要重写HashCode跟equals方法,原因是要遵循equals相等,hashCode也一定相等,hashCode相等,equals不一定相等的规则。String就重写的这两个方法。

Map<key,value>🍉

HashMap 主选🥝

结构:哈希表(数组+链表)

无序的 只允许一个key为null,可多个值为null

线程不安全

采用分离链表法解决冲突

通过hashCode()、equals()保证元素的唯一性,hashCode()确定数组位置,equlas()确定是否可存放在链表。

实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。

JDK1.8增加了红黑树来进行优化。即当链表超过8时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能。

缺点:多线程put会陷入死循环,因为Entry链表形成环形数据结构,查找时会陷入死循环。用迭代器遍历时修改集合结构会发生错误。

遍历方法:

    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
    while (entries.hasNext()) {
	    Map.Entry<Integer, Integer> entry = entries.next();
	    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
    }

LinkedHashMap 🍓

结构:数组+双链表

与HashMap相比,LinkedHashMap 的元素是有序的,在LruCache中有使用,因为是LRU,最近最少使用算法需要支持有序。

HashTable🥝

结构:哈希表

key还是value都不能为null

synchronized实现线程安全

实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆

TreeMap🥝

结构:红黑树

排序方法有自然排序、比较器排序

线程不安全 可以插入null键,null值;

无序集合(插入和遍历顺序不一致)

常用方法:

void clear()  从此映射中移除所有映射关系(可选操作)。
 
boolean containsKey(Object key)  如果此映射包含指定键的映射关系,则返回 trueboolean containsValue(Object value)  如果此映射将一个或多个键映射到指定值,则返回 trueSet<Map.Entry<K,V>> entrySet()  返回此映射中包含的映射关系的 Set 视图。
boolean equals(Object o)  比较指定的对象与此映射是否相等。
 
V get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 nullint hashCode() 返回此映射的哈希码值。
 
boolean isEmpty() 如果此映射未包含键-值映射关系,则返回 trueSet<K> keySet()  返回此映射中包含的键的 Set 视图。
 
V put(K key, V value)  将指定的值与此映射中的指定键关联(可选操作)。
 
void putAll(Map<? extends K,? extends V> m)  从指定映射中将所有映射关系复制到此映射中(可选操作)。
 
V remove(Object key)  如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
 
int size()  返回此映射中的键-值映射关系数。
 
Collection<V> values()  返回此映射中包含的值的 Collection 视图。

Queue FIFO队列🥝

操作失败就抛出异常
 
add(E e):添加一个元素到队尾
 
remove():获取队首的元素,并从队列中移除
 
element():获取队首的元素,但不从队列中移除
 
这一组,成功返回true,失败时返回一个特殊值(取决于操作,为NULL或false)offer(E e)操作是专为容量受限的队列实现而设计的;在大多数实现中,插入操作不会失败。
 
offer(E e):添加一个元素到队尾
 
poll():获取队首的元素,并从队列中移除
 
peek():获取队首的元素,但不从队列中移除

迭代器(Iterator)🥝

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

Java中的Iterator功能比较简单,并且只能单向移动:

使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
hasNext():判断当前元素是否存在,并没有指向的移动
next():返回当前元素, 并指向下一个元素
使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。

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

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

相关文章

第十三章 原理篇:SWIN-transformer

累了&#xff0c;没写完 面试完了再来写 参考教程&#xff1a; swin-transformer/model.py 文章目录 概述transformer blockswindow_partionW-MSAwindow-reversePatch Merging 概述 在前面介绍了vision transformer的原理&#xff0c;加入transformer的结构后&#xff0c;这种…

HCIP(HCIA回顾)

OSI/RM 七层 应用层 表示层 会话层 传输层 区分不同的流量&#xff0c;定义传输方式。 端口号由16位二进制构成&#xff0c;范围为0~65535(其中0不作为传输层的端口使用)&#xff0c;所以真实取值范围为1~65535&#xff1b;其中&#xff0c;1~1023称为知名端口号。 1、可靠…

React Native 集成到iOS原有的项目上

1.官方说明地址&#xff1a; 集成到现有原生应用 2. 主要步骤说明 把 React Native 组件集成到 iOS 应用中有如下几个主要步骤&#xff1a; 配置好 React Native 依赖和项目结构。了解你要集成的 React Native 组件。使用 CocoaPods&#xff0c;把这些组件以依赖的形式加入到项…

【推式子 二项式定理】Wannafly挑战赛 B

B-求值2_Wannafly挑战赛17 (nowcoder.com) 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long longusing namespace std;const int mxn2e610; const int mxe2e510; const int Inf0x3f3f3f3f; const int mod998244353;int N;…

碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型

文章目录 效果一览文章概述研究内容源码设计参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于RF随机森林的碳排放预测模型 研究内容 碳排放被认为是全球变暖的最主要原因之一。 该项目旨在提供各国碳排放未来趋势的概述以及未来十年的全球趋势预测。 其方法是分析这…

sql统计某一字段不同状态的数量,时间戳转日期格式、按月统计使用

背景 1、在sql语句中统计一个字段的不同状态时&#xff0c;需要将每个状态的数量查出来&#xff0c;在进行统一输出&#xff0c;涉及表多次查询&#xff0c;下面用一个聚合函数的方式进行查询&#xff0c;比较方便&#xff0c;容易理解。 2、有时候数据表中的时间字段存储的是…

谈高考志愿填报

目录 不如先说说我自己。 一、选专业还是选学校&#xff1a; 二、你想推荐/避雷的专业&#xff1a; 三、填报志愿的策略&#xff1a; 四、影响专业选择的因素&#xff1a; 各省高考成绩已出&#xff0c;又到一年高考季。张雪峰提到&#xff1a;“普通家庭不要光谈理想&…

OpenCV实战(27)——追踪视频中的特征点

OpenCV实战&#xff08;27&#xff09;——追踪视频中的特征点 0. 前言1. 追踪视频中的特征点2. 特征点追踪原理3. 完整代码小结系列链接 0. 前言 我们已经知道可以通过一些最独特的点来分析图像&#xff0c;对于图像序列同样如此&#xff0c;其中一些特征点的运动可用于了解捕…

机器视觉之表面缺陷检测

曾有一个科研项目&#xff0c;青岛啤酒厂委托&#xff0c;研究啤酒瓶的质量检测。 一般这种玻璃瓶会有一定次品、不良品&#xff0c;特征是&#xff0c;内部细细的裂缝纹路长度长于一定限制&#xff0c;那么这种啤酒瓶在运输或者开瓶盖的过程中就有炸裂的风险。 所以&#xf…

【实证分析】地区竞争、推广数字普惠金融与绿色经济效率

研究内容 基于考虑非期望产出的 Super-SBM 模型测算了 2011—2018 年中国 265 个地级市的绿色经济效率,综合运用面板模型、空间杜宾模型,系统分析了地区竞争下推广数字普惠金融对绿色经济效率的影响效应。研究发现:(1)绿色经济效率存在显著正向空间溢出效应,地理距离与经济差异…

mysql数据(添加,修改,删除,单表查询)操作

插入&#xff1a; 主键自增&#xff08;第一列&#xff09;&#xff0c;可以写null&#xff0c;自动生成 最后一列是空值null&#xff0c;即不给分配 如果设置了默认值&#xff0c;如性别设置了默认值男&#xff0c;就可以写default 1、 查询起别名&#xff0c;如果别名有特…

操作数据库DDL、DML

DDL 1、创建表 create table tb_user(id int,username varchar(20),password varchar(10) ) 2、数据类型 3、删除表 drop table 表名 4、修改表 修改表名 alter table 表名 rename to 新表名 添加一列 alter table 表名 add 列名 数据类型修改数据类型 …

Vue中watch与computed区别

<body><div id"root">姓&#xff1a;<input type"text" v-model"firstName"><br/><br/>名&#xff1a;<input type"text" v-model"lastName"><br/><br/>全名&#xff1a;&…

virtio-net前端-virtqueue

文章目录 1.概述2.数据结构3. 流程分析3.1 virtio总线创建3.3virtio-net3.3.1virtio-net初始化![在这里插入图片描述](https://img-blog.csdnimg.cn/7246c1705ac24f88b75fad63f8941ca5.png)3.3.2 virtio-net驱动发送3.3.3 Qemu virtio-net设备接收 4.virtqueue4.1数据结构4.2发…

模糊测试Fuzzing基础知识学习笔记

概念 模糊测试&#xff08;Fuzzing&#xff09;&#xff0c;是一种通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。在模糊测试中&#xff0c;用随机坏数据&#xff08;也称做 fuzz&#xff09;攻击一个程序&#xff0c;然后观察哪里遭到了破坏。 模糊测试…

6.Mysql自连接

针对相同的表进行的连接被称为“自连接”&#xff08;self join&#xff09; 那么为什么要把相同的一张表连接起来呢&#xff1f;一开始还是挺难理解的。把它想象成连接两张不同的表&#xff0c;这样容易理解一些。事实上&#xff0c;自连接还是有很多用处的 1. 在同一张表内进…

模板初识与STL简介

初识模板 引言函数模板定义实例化隐式实例化显式实例化 类模板定义实例化 STL简介STL六大组件 总结 引言 模板是泛型编程的基础 在之前我们介绍过函数重载&#xff0c;可以定义许多函数名相同参数列表不同的重载函数&#xff0c;来实现不同类型的相似操作。调用重载函数时会根…

chatgpt赋能python:归一化在PyTorch中的运用

归一化在PyTorch中的运用 PyTorch是一种广泛使用的深度学习框架&#xff0c;它可以用于训练和预测各种类型的神经网络。在深度学习中&#xff0c;归一化是提高模型性能的一种常用技术。归一化是指将输入数据进行标准化或规范化处理&#xff0c;以确保数据的统一性和一致性。在…

golang硬核技术(二)go程序从启动到运行到底经历了啥

前言 go相对其他语言&#xff0c;对并发的支持更友好。这使得他的设计和其他程序迥然不同。让我们来看看它都是如何初始化程序的&#xff0c;从程序加载到运行到底经历的什么。 我们继续之前的版本1.18.4 汇编入口 首先我们编译一个hello world 程序。 package main impor…

python--连接oracle数据库

python--连接oracle数据库 前言一、安装cx_Oracle二、导入库三、数据库操作实例3.1 连接3.2数据库查询3.3数据库插入3.4 实例从某网站上面爬取彩票号码 四、异常4.1、运行时&#xff0c;出现连接数据库失败:DatabaseError:DPI-1047解决连接失败问题1、查看Oracle的版本号2、进入…