Java基础六 - Collection集合List、Set、Queue,Map
1. List - ArrayList、LinkedList、Vector
- ArrayList
1. 可以有重复元素
2. 超出后自动增加大小,增加一半。会自动重新分配更大的数组,并将元素复制到新数组中
3. 通过索引保存值,访问可以通过索引访问,更加高效。但是添加/删除效率满,
因为操作后需要把其他的全部移动一遍
2. LinkedList
1. 通过前后的链表构成一个位置
2. 遍历需要从头开始,效率低
3. 新增/删除 方便,只需要改变链表的链接顺序即可
3. Vector
1. 线程安全,使用同步的方式更新数据,性能较差
4. 常见使用方法
add(E element):向ArrayList的末尾添加元素。
add(int index, E element):在指定位置插入元素。
remove(int index):删除指定位置的元素。
get(int index):获取指定位置的元素。
set(int index, E element):将指定位置的元素替换为新元素。
size():获取ArrayList的大小(元素个数)。
isEmpty():判断ArrayList是否为空。
contains(Object o):判断ArrayList是否包含指定元素。
indexOf(Object o):返回指定元素在ArrayList中第一次出现的位置。
lastIndexOf(Object o):返回指定元素在ArrayList中最后一次出现的位置。
subList(int fromIndex, int toIndex)方法,该方法用于获取LinkedList的子列表
2. Set - HashSet、LinkedHashSet、TreeSet
1. HashSet
1. 不保留插入顺序,不允许重复元素存在
2. 实现基于哈希表的数据结构
3. 由于哈希表的高效性,查找速度非常快。插入时如果重复,
会覆盖,通过红黑树/链表解决冲突
4. 允许存储null元素哈希表:
是一种数据模式:维护了一个表,key是hash值,value是统一的值PRESENT。
如果在hashset中存储数据,会把数据转换为hash值,放到对应的hash表中
2. LinkedHashSet
1. 和hashSet差不多,保留了插入顺序
2. 不允许存在null
3. 不允许重复元素
3. TreeSet
1. 使用红黑树存储元素
2. 不许存在null
3. 支持按照添加顺序保留/自定义顺序
4. 常用方法
add(E e):向LinkedHashSet添加元素。
remove(Object o):从LinkedHashSet中移除指定元素。
contains(Object o):判断LinkedHashSet是否包含指定元素。
size():获取LinkedHashSet中元素的个数。
isEmpty():判断LinkedHashSet是否为空。
clear():清空LinkedHashSet中的所有元素。
3. Map - HashMap、TreeMap、LinkedHashMap、Hashtable
1. HashMap
1. 使用hash表存储map中的key,value映射在对应的桶中。快速查找
2. 允许null
3. 无须,并且不允许存在重复key
2. LinkedHashMap
1. 保留存储顺序
2. 不允许key为null
3. 双向链表存储
3. TreeMap
1. 有序,可以按照插入顺序或者自定义
2. 使用红黑树存储键
4. Hashtable
1. 类似于HashMap,线程安全,都是同步的,性能较差
2. 不允许null存在
3. 是否包含key使用contains();是否包含value使用containsValue()而在hashMap中使用containsKey();containsValue();
5. 使用方法
* put(K key, V value):将键值对添加到Map中。* get(Object key):获取指定键对应的值。* remove(Object key):从Map中移除指定键的键值对。* containsKey(Object key):判断Map是否包含指定的键。* containsValue(Object value):判断Map是否包含指定的值。* size():获取Map中键值对的数量。* isEmpty():判断Map是否为空。* keySet():返回Map中所有键的Set集合。* values():返回Map中所有值的Collection集合。* entrySet():返回Map中所有键值对的Set集合。* replace() : 替换
@Testvoid testMap(){HashMap<String, Integer> map = new HashMap<String, Integer>();map.put("First", 1);map.put("Second", 2);map.put("Third", 3);map.put("Forth", 4);System.out.println("获取First指定键对应的值:" + map.get("First"));System.out.println("判断Map是否包含指定的键:" + map.containsKey("First"));System.out.println("判断Map是否包含指定的值" + map.containsValue(5));System.out.println("获取Map中键值对的数量" + map.size());System.out.println("判断Map是否为空" + map.isEmpty());Set<String> strings = map.keySet();String resKeys = strings.toString();System.out.println("返回Map中所有键的Set集合:" + resKeys);Collection<Integer> collection = map.values();String resValues = collection.toString();System.out.println("返回Map中所有值的Collection集合" + resValues);Set<Map.Entry<String,Integer>> entrySet = map.entrySet();for (Map.Entry<String, Integer> entry: entrySet){System.out.println("返回Map中所有键值对的Set集合Key-->" + entry.getKey() + ", Value-->" + entry.getValue());}map.remove("First");map.replace("Forth", 40);}
4. 遇到的一些问题及解决方案
1. 遍历map的时候不能remove或者replace,一个集合在迭代器遍历的过程中被修改(增加、删除元素),则会抛出ConcurrentModificationException。这个异常是为了保护迭代器的一致性,因为迭代器在遍历过程中维护着一个期望的集合状态,如果集合发生了修改,那么迭代器的状态就变得不一致了,因此抛出异常。
解决方案:
//把map存储在Entry里面Set<Map.Entry<String,Integer>> entrySet = map.entrySet();//把Map.Entry在Set容器,提取转换为迭代器Iterator<Map.Entry<String,Integer>> iterator = entrySet.iterator();while (iterator.hasNext()){Map.Entry<String,Integer> entry = iterator.next();//使用迭代器删除map的元素iterator.remove();System.out.println("返回Map中所有键值对的Set集合Key-->" + entry.getKey() + ", Value-->" + entry.getValue());}
5. 遍历Map的方法
//方法1,使用keySet()遍历for (String s : map.keySet()){System.out.println("返回Map中所有键值对的Set集合Key-->" + s + ", Value-->" + map.get(s));}//把map存储在Entry里面Set<Map.Entry<String,Integer>> entrySet = map.entrySet();//把Map.Entry在Set容器,提取转换为迭代器Iterator<Map.Entry<String,Integer>> iterator = entrySet.iterator();//方法2:使用迭代器遍历while (iterator.hasNext()){Map.Entry<String,Integer> entry = iterator.next();iterator.remove();System.out.println("返回Map中所有键值对的Set集合Key-->" + entry.getKey() + ", Value-->" + entry.getValue());}//entrySet 遍历for (Map.Entry<String, Integer> entry: entrySet){System.out.println("返回Map中所有键值对的Set集合Key-->" + entry.getKey() + ", Value-->" + entry.getValue());}for (Map.Entry<String,Integer> entry : map.entrySet()){System.out.println("返回Map中所有键值对的Set集合Key-->" + entry.getKey() + ", Value-->" + entry.getValue());}
另外,toArray()方法就是一坨屎
6. HashMap/HashSet存储原理
HashMap
1. 先拿到key,计算出对应的hash值
2. 在hashTable(维护了一个表,key是hash值,value是统一的值PRESENT)
找到对应的索引位置,然后在这个索引位置(桶)放置键值对
3. 如果有冲突,会使用红黑树/链表把value保存起来HashSet差不多,就是Value存储了默认的PRESENT
7. 哪些集合是线程安全的
1. Vector 比ArrayList多了线程安全
2. HashTable 比HashMap多了线程安全
3. Stack
4. enumeration:枚举,相当于迭代器。
相关文章:
Java基础六 - Collection集合List、Set、Queue,Map
1. List - ArrayList、LinkedList、Vector ArrayList 1. 可以有重复元素 2. 超出后自动增加大小,增加一半。会自动重新分配更大的数组,并将元素复制到新数组中 3. 通过索引保存值,访问可以通过索引访问,更加高效。但是添加/删除…...
k8s nginx+ingress 配置
1 nginx> ingress 配置: 2 nginx >service 配置 3 nginx pod配置: 4 nginx.conf 配置文件: # web端v1server{listen 30006;add_header Strict-Transport-Security "max-age31536000; includeSubDomains";#add_header Content…...
探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面
文章目录 1 前言2 显示HTML的内容3 显示Markdown内容4 显示代码块5 显示DataFrame的交互式表格6 显示音频和视频7 显示图表8 显示图片9 显示地图10 显示PDF文件11 显示文件下载链接12 结语 1 前言 在这篇博文中,我们将着重介绍Streamlit中一个核心而重要的函数&…...
LinAlgError: Singular matrix 问题解决
错误log: c:\Program Files\Python39\lib\site-packages\numpy\linalg\linalg.py in inv(a)543 signature D->D if isComplexType(t) else d->d544 extobj get_linalg_error_extobj(_raise_linalgerror_singular) --> 545 ainv _umath_lin…...
【ASP.NET MVC】使用动软(五)(13)
一、问题 前文完成的用户登录后的首页如下: 后续账单管理、人员管理等功能页面都有相同的头部,左边和下边,唯一不同的右边内容部分,所以要解决重复设计的问题。 二、解决方法——使用布局页 在Views上右键添加新建项ÿ…...
MongoDB面试题
1. NoSQL 数据库是什么意思?NoSQL 与 RDBMS 直接有什么区别?为什么要使用和不使用 NoSQL 数据库?说一说 NoSQL 数据库的几个优点? NoSQL 是非关系型数据库,NoSQL Not Only SQL。 关系型数据库采用的结构化的数据,NoSQL 采用的是键值对的方式存储数…...
Python Web 开发 Flask 介绍
WEB开发是现在程序必会的技能,因为大部分软件都以Web形式提供,及时制作后台开发,或者只做前台开发,也需要了解Web开发的概念和特点。由于Python是解释性脚本语言,用来做Web开发非常适合,而且Python有上百种…...
本地mvn仓库清理无用jar包
背景 开发java时间久了,本地的m2仓库就会产生很多过期的jar包,不清理的话比较占空间。 原理 是通过比较同一目录下,对应jar包的版本号的大小,保留最大版本号那个,删除其他的。 脚本 执行脚本见文章顶部 执行方式 …...
MySQL的常用函数大全
一、字符串函数 常用函数: 函数功能CONCAT(s1, s2, …, sn)字符串拼接,将s1, s2, …, sn拼接成一个字符串LOWER(str)将字符串全部转为小写UPPER(str)将字符串全部转为大写LPAD(str, n, pad)左填充,用字符串pad对str的左边进行填充࿰…...
一百四十三、Linux——Linux的CentOS 7系统语言由中文改成英文
一、目的 之前安装CentOS 7系统的时候把语言设置成中文,结果Linux文件夹命名出现中文乱码的问题,于是决定把Linux系统语言由中文改成英文 二、实施步骤 (一)到etc目录下,找到配置文件locale.conf # cd /etc/ # ls…...
一 关于idea如何在svn进行项目下载并运行成功
安装svn客户端 如图 安装时请选择该选项(Will be installed on local hard drive)并选择自己想要安装的目录路径 如图 svn安装成功 如图 注意 安装完成后,使用svn进行一次checkout的项目导出完成以上五步时&…...
python使用selenium 打开谷歌浏览器闪退, 怎么解决
问题描述: 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 使用 Selenium 操作 Chrome 浏览器, Chrome 浏览器闪退 问题解决: 可能是以下几个方面出现了问题: 1. Chromedriver 版本与 Chrome 浏览器版本不匹配 你需要确保你正在…...
.net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration)
现在有两张表,结构一模一样,我又不想创建两个一模一样的model,就想一个model映射到两张表 废话不多说直接上代码 安装依赖包 创建model namespace oneModelMultiTable.Model {public class Test{public int id { get; set; }public string…...
CISCO MDS 9148 SAN Switch 交换机命令配置方法:
前言 CISCO MDS 9148 SAN 交换机已经停产,但还是要掌握一下配置的方法: 升级款后面 9148S 或者 9100系列,但配置方式基本都差不多,掌握一个就好: 高性能和极具吸引力的价值 Cisco MDS 9148S 16G 多层光纤交换机是下…...
图的深度、广度优先探索(数据结构)
深度: #include <stdio.h> #include <stdlib.h> #define MAX 20typedef struct ANode {int adjver,len;struct ANode*next; } ArcNode;typedef struct VNode {int data;ArcNode*firstarc; } VertexNode;typedef struct {VertexNode vers[MAX1];int ver…...
c语言小知识点
文章目录 int main()与int main(void)符号常量常变量无符号赋值将占字节多的赋值给字节少的类型赋初值 表达式预处理格式符e格式符 循环for 输入长度相关输出文件管理 int main()与int main(void) int main(void) 指的是此函数的参数为空,不能传入参数,…...
C++ - 模板分离编译
模板分离编译 我们先来看一个问题,我们用 stack 容器的声明定义分离的例子来引出这个问题: // stack.h // stack.h #pragma once #include<deque>namespace My_stack {template<class T, class Container std::deque<T>>class stack…...
如何把非1024的采样数放入aac编码器
一. aac对数据规格要求 二、代码实现 1.初始化 2.填入数据 3.取数据 三.图解 一. aac对放入的采样数要求 我们知道aac每次接受的字节数是固定的,在之前的文章里有介绍libfdk_aac音频采样数和编码字节数注意 它支持的采样数和编码字节数分别是: fdk_aac …...
linux安装nodejs和vue
下载nodejs 打开 下载地址页面中下载**Linux Binaries (x64)**的二进制包设置安装目录 sudo mkdir -p /usr/local/lib/nodejs # 解压 如下载的 node-v18.17.0-linux-x64.tar.xz sudo tar -xJvf node-v18.17.0-linux-x64.tar.xz -C /usr/local/lib/nodejs 加入到PATH #######…...
spring整合mybatis
所需配置: <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>m…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...
