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…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
