android HashMap和List该如何选择
目录
一,ArrayList
1.1 数组
1.2 扩容
1.3 查询
1.4 插入,删除
1.5 小结
二,LinkedList
2.1 链表
2.2 查找
2.3 插入
2.4 小结
三,HashMap
扩容
四,SparseArray
五,ArrayMap
一,ArrayList
1.1 数组
ArrayList底层是基于数组实现的,数组也就是一种用连续的内存空间存储相同数据类型数据的线性数据结构。其源码如下:
transient Object[] elementData;
1.2 扩容
默认情况下,当创建一个新的 ArrayList
时,如果没有指定初始容量,它的初始容量是 10。
private static final int DEFAULT_CAPACITY = 10;//默认数组大小
当向ArrayList中添加元素,且当前数组已满时(即当前元素数量等于数组容量),ArrayList 会自动扩容。扩容是通过创建一个新的数组并将旧数组的元素复制到新数组来实现的。默认的扩容策略是新容量为旧容量的 1.5 倍(即旧容量加上旧容量的 50%)。例如,如果当前容量是 10,新容量将是 15。
从 Java 7 开始,为了提高性能,扩容策略有所改变。在添加元素时,如果添加元素后的大小超过当前容量的 75%,则会进行扩容,扩容大小为当前容量的 1.5 倍。
private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);
}
1.3 查询
ArrayList
是 Java 中的一个动态数组实现,它继承自 AbstractList
并实现了 List
接口。由于其内部实现是基于数组的,所以在某些操作上,特别是在随机访问元素时,它的性能通常优于链表结构。ArrayList
支持快速的随机访问。当我们通过索引访问元素时(例如 get(index)
),因为数组是连续存储的,可以直接通过计算偏移量来访问任何位置的元素,这通常是非常快的(接近 O(1) 的时间复杂度)。
但是当我们需要查找数组中是否存在某个特定元素(例如使用 contains(Objecto)
或 indexOf(Object o)
方法)时,ArrayList
的性能就不那么好了。这是因为这些操作通常需要遍历整个列表来查找元素,其时间复杂度接近 O(n),其中 n 是列表的大小。
1.4 插入,删除
先来看看插入元素的代码:
public void add(int index, E element) {if (index > size || index < 0)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));ensureCapacityInternal(size + 1); // Increments modCount!!System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;
}
可以看到插入元素是通过移动整个数组来实现,其原理如下图:
所以ArrayList的插入和删除操作是很消耗性能的。
1.5 小结
结合以上我们可以看出,ArrayList的特点就是查询快,插入和删除慢
二,LinkedList
2.1 链表
LinkedList是基于链表实现的,链表是一种常见的数据结构,用于存储一系列的元素。与数组相比,链表在内存中的存储方式有所不同。
链表的内存管理是通过指针实现的。每个节点仅知道其直接后继节点的地址。当删除一个节点时,通常只需要断开该节点的next
指针即可,而不需要移动其他节点的内存位置。这使得内存的分配和释放非常灵活和高效。
2.2 查找
先看以下LinkedList的源码:
Node<E> node(int index) {// assert isElementIndex(index);if (index < (size >> 1)) {Node<E> x = first;for (int i = 0; i < index; i++)x = x.next;return x;} else {Node<E> x = last;for (int i = size - 1; i > index; i--)x = x.prev;return x;}
}
从上面源码可以看出,查找时需要遍历,所以性能损耗比较大。
2.3 插入
我们看一下插入的图片:
从上面这个图片可以看出,插入时只需要将前后元素的指针指向对应元素即可。所以链表的结构在执行插入和删除的操作时效率是非常高的。
2.4 小结
结合以上我们可以看出,LinkedList的特点就是查询慢,插入和删除快
三,HashMap
从上面我们可以看出ArrayList和LinkedList各自有各自的优缺点,那么有没有一种数据结构查询和插入删除都快呢?
下面我们要说的HashMap就满足上面的要求。
在JDK1.7之前,HashMap的数据结构为数组加链表的结构
在JDK1.8之后,HashMap的数据结构为数组加链表加红黑树的结构
先看下面HashMap的数据结构图片:
这就是数组加链表的结构
那么一个数据是如何插入到HashMap中的?下面我们来分析下。
首先,我们先看看源码:
static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
这段代码是得到一个对象的Hash值,并且通过 h ^ (h >>> 16)
将哈希码的高16位与低16位进行异或操作。这样做的目的是将高位的信息融入低位,提升低位的随机性。哈希表通常用 (n-1) & hash
计算索引(n
是桶的数量,为2的幂),这仅利用了哈希码的低位。若低位重复率高,会导致冲突。通过异或混合高位,使低位同时受高位影响,分布更均匀。
下面我们通过图片来演示下:
上面这种情况就是所谓的hash碰撞,hashmap就是通过链表解决了hash碰撞的问题。
扩容
首先我们需要理解一下为什么需要扩容?
如果不扩容,hash碰撞会越来越多,必然会导致链表的长度越来越长,这时查询的效率就会非常慢,这时就需要增加数组的长度来避免链表的长度过长。
HashMap的扩容我们需要了解几个概念:
1,负载因子,一个决定 HashMap 扩容策略的参数。默认值是 0.75。它用于衡量 HashMap 中使用的空间与实际容纳的空间之间的比率。当 HashMap 中的元素数量超过这个比率所计算的阈值时,它将扩容。
static final float DEFAULT_LOAD_FACTOR = 0.75f; //负载因子默认值0.75
final float loadFactor;//负载因子public HashMap() {this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
2,扩容阈值,即当 HashMap 中的元素数量达到该值时,将触发扩容。阈值由 capacity * load factor
计算得出。它帮助管理 HashMap 的容量和负载因子,防止在高负载下性能下降。
// (The javadoc description is true upon serialization.
// Additionally, if the table array has not been allocated, this
// field holds the initial array capacity, or zero signifying
// DEFAULT_INITIAL_CAPACITY.)
int threshold;
比如一个数组的长度是16,负载因子是0.75 那么阈值就是16 * 0.75 =12
当元素的个数大于12时,就会触发hashmap的扩容机制。
这里需要注意一下的是,数组的长度我们最好使用的是2的次幂。
为什么是2的次幂呢?
我们计算hash值时之前使用的是 hashcode & (length -1)
比如一个数组的长度是16 ,hashCode 是110 那么计算就是:
0110
1111
结果为0110 它的三位110都生效了
假如一个数组的长度是10 ,hashCode是110 那么计算就是:
0110
1001
结果是0000 但是中间两位00得到的结果永远都是0,其实是不生效的,这样就会增加hash碰撞的概率。
那么hashmap有没有什么缺点呢?
其实是有的,当我们扩容的时候,会有25%的空间被浪费了,其实就是用空间来换时间。
但是空间对android来说是非常重要的。这一点还是需要了解的。
四,SparseArray
SparseArray从字面上可以理解为松散不连续的数组。虽然叫做Array,但它却是存储K-V的一种数据结构。其中Key只能是int类型,而Value是Object类型。
其数据结构如下:
它的key是从小到大排序的有序数组,既然是有序数组,那么它的查找就是使用的二分法,这样就提升了查找的效率。
而且它有一个特点就是越用越快,为什么呢?因为它删除某个元素后,会将它的key标记为delete。当下次再有相同key的元素插入时,就可以直接插入到标记的位置,提高了效率。
但是它还有一个缺点,就是key必须是int类型,这样就限制很大。
五,ArrayMap
ArrayMap的内部结构同SparseArray一样,但是它的key没有必须是int。这样既提高了效率又提高了灵活性。比较推荐andaroid开发者使用ArrayMap。
相关文章:
android HashMap和List该如何选择
目录 一,ArrayList 1.1 数组 1.2 扩容 1.3 查询 1.4 插入,删除 1.5 小结 二,LinkedList 2.1 链表 2.2 查找 2.3 插入 2.4 小结 三,HashMap 扩容 四,SparseArray 五,ArrayMap 一,ArrayList 1.…...
Visual Studio 2022 远程调试
Visual Studio 2022 远程调试全过程 这篇文章尽可能地精细记录如何使用 Visual Studio 2022 完成 Windows 系统上的远程调试。适用场景包括本地编译,远程运行,两台机器分工合作调试。 一、设备网络通信环境 1.1 确保两台设备通信 本地设备: 安装 Visu…...
Linux:线程同步与互斥
目录 线程互斥 锁 初始化 销毁 加锁 解锁 线程同步 条件变量 初始化 销毁 等待条件满足 唤醒等待 pthread_cond_signal pthread_cond_broadcast 生产者消费者模型 3种关系 2种角色 1个交易场所 POSIX信号量 初始化 销毁 等待 发布 线程互斥 互斥相关…...
Kotlin Android LeakCanary内存泄漏检测实战
在Kotlin Android应用中使用LeakCanary检测内存泄漏的步骤如下: 1. 添加依赖 在模块的build.gradle文件中添加LeakCanary依赖: dependencies {debugImplementation com.squareup.leakcanary:leakcanary-android:2.12 // 使用最新版本 }2. 自动初始化&…...
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
在 MySQL 中,COUNT(*)、COUNT(1) 和 COUNT(字段名) 的核心区别在于 统计逻辑 和 性能表现,具体如下: 1. 统计逻辑差异 函数形式统计规则COUNT(*)统计表中所有行的数量,忽略字段值是否为 NULL(包括主键、非主键、NULL …...
CAD属性图框值与Excel联动(CAD块属性导出Excel、excel更新CAD块属性)——CAD c#二次开发
CAD插件实现块属性值与excel的互动,效果如下: 加载dll插件(CAD 命令行输入netload ,运行xx即可导出Excel,运行xx1即可根据excel更新dwg块属性值。) 部分代码如下 // 4. 开启事务更新CAD数据using (Transact…...
青少年编程与数学 02-019 Rust 编程基础 05课题、复合数据类型
青少年编程与数学 02-019 Rust 编程基础 05课题、复合数据类型 一、元组(Tuple)(一)元组的定义(二)创建元组示例 (三)解构元组示例 (四)使用点号语法访问元组…...
51单片机入门教程——AT24C02数据存储
前言 本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。 目录 …...
cdn 是什么?
内容分发网络,Content Delivery Network 介绍 CDN(Content Delivery Network)是一种将内容分发到靠近用户的边缘服务器,以加速访问速度、减少延迟、降低源站压力的网络系统。 CDN 把网站的静态资源(如 HTML、JS、CSS、…...
ENSP三层交换机实验原理及过程
华为eNSP(Enterprise Network Simulation Platform)是一款网络仿真工具,用于模拟华为网络设备的配置和操作。在三层交换机实验中,主要涉及三层交换机的路由功能、VLAN间通信、静态路由、动态路由协议(如OSPF、RIP&…...
RK3568-OpenHarmony(1) : OpenHarmony 5.1的编译
概述: 本文主要描述了,如何在ubuntu-20.04操作系统上,编译RK3568平台的OpenHarmony 5.1版本。 搭建编译环境 a. 安装软件包 sudo apt-get install git-lfs ruby genext2fs build-essential git curl libncurses5-dev libncursesw5-dev openjdk-11-jd…...
动态路由EIGRP的配置
动态路由EIGRP的配置 动态路由EIGRP:增强内部网关协议 为何收敛快、不成环? 路由计算的无环路和路由的收敛速度是路由计算的重要指标。EIGRP协议由于使用了DUAL算法,使得EIGRP协议在路由计算中不可能有环路路由产生,同时路由计…...
Paging 3.0 + Kotlin 分页加载指南
Paging 3.0 是 Android Jetpack 组件中用于高效分页加载数据的现代化方案,结合 Kotlin 协程和 Flow 特性,能够显著简化分页逻辑的实现。以下是完整的实现指南和最佳实践: 一、Paging 3.0 核心优势 内置加载状态管理:自动跟踪加载…...
湖南(源点咨询)市场调研 商业综合体定位调研分享(下篇)
接着中篇,我们就要重点分析一下该地区消费者的特点: 综合来看,本地区还是以中等收入工薪阶层的新市民家庭为主,以亲子关系为家庭核心,居住条件改善、生活向好,渴望公共配套的提升丰富生活质感,…...
vue 中的ref
vue 中的ref vue 中的ref 1. ref ** 的基本作用** 在 Vue 中,ref 是用来获取 DOM 元素或者组件实例的一种方式。对于 <el-form> 组件,通过 ref 可以获取到该表单组件的实例,进而调用表单组件提供的各种方法和访问其属性。 …...
Kotlin 协程 vs RxJava vs 线程池:性能与场景对比
1. 轻量级任务:10,000 个并发延迟操作 假设需要并发执行 10,000 个非阻塞延迟任务(如模拟定时请求): 线程池实现 ExecutorService executor Executors.newFixedThreadPool(64); // 最多 64 线程 List<Future<?>>…...
golang-ErrGroup用法以及源码解读笔记
介绍 ErrGroup可以并发执行多个goroutine,并可以很方便的处理错误 与sync.WaitGroup相比 错误处理 sync.WaitGroup只负责等待goroutine执行完成,而不处理返回值或者错误errgroup.Group目前虽然不能直接处理函数的返回值或错误。但是当goroutine返回错…...
遗传算法组卷系统实现(Java版)
遗传算法组卷系统实现(Java版) 下面是一个完整的遗传算法组卷系统的Java实现,包含题目表示、适应度计算、选择、交叉和变异等核心操作。 1. 核心类设计 1.1 题目实体类(Question.java) public class Question {pri…...
JVM 逃逸分析
JVM逃逸分析:让Java对象"乖乖听话"的侦探游戏 大家好!我是你们的老朋友"代码神探福尔摩斯",今天要带大家破解一个JVM界的经典悬案——如何让Java对象乖乖待在它该待的地方? 第一章:案发现场——…...
第三天——贪心算法——区间问题
题目描述 给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。 输入输出样例 输入是一个数组,包含多个长度固定为的子数组,表示每个区间的开始和结尾。输出一个 整数,表示需要移除的区间数量。 …...
路由重发布
路由重发布 实验目标: 掌握路由重发布的配置方法和技巧; 掌握通过路由重发布方式实现网络的连通性; 熟悉route-pt路由器的使用方法; 实验背景:假设学校的某个分区需要配置简单的rip协议路由信息,而主校…...
嵌入式与物联网:C 语言在边缘计算时代的破局之道
引言 在万物互联的 2025 年,全球物联网设备连接数突破 300 亿台,其中 78% 的嵌入式控制系统仍基于 C 语言开发。这种跨越半个世纪的编程语言,正以新的技术形态在智能汽车、工业物联网、边缘计算等领域重塑竞争力。本文通过三个前沿应用场景&…...
计算机网络:WiFi路由器发射的电磁波在空气中的状态是什么样的?
WiFi路由器发射的电磁波是高频无线电波,属于微波频段(2.4GHz或5GHz),在空气中以光速传播(约310⁸米/秒),其传播状态和特性可通过以下维度详细解析: 一、电磁波的物理特性 频率与波长 2.4GHz频段:波长约12.5厘米,穿透力较强但易受干扰(微波炉、蓝牙等共用频段)。5GH…...
使用FastAPI和Apache Flink构建跨环境数据管道
系统概述 本文介绍如何使用FastAPI微服务、Apache Flink和AWS ElastiCache Redis构建一个可扩展的数据管道,实现本地Apache Hive数据仓库与AWS云上Redis之间的数据交互。 该架构通过FastAPI提供RESTful接口,Apache Flink处理数据流,实现了本…...
解决 SQL Server 2008 导入 Excel 表卡在“正在初始化数据流”问题
在使用 SQL Server 2008 导入 Excel 表时,可能会遇到卡在“正在初始化数据流”这一令人困扰的情况。笔者近期也遭遇了同样的问题,尝试了多种常规方法均未解决,最终通过特定命令成功化解难题,在此分享解决过程与经验。 一、问题描…...
【Linux系统】从零开始构建简易 Shell:从输入处理到命令执行的深度剖析
文章目录 前言一、打印命令行提示符代码功能概述 二、读取键盘输入的指令2.1 为什么不继续使用scanf()而换成了fgets()?2.2 调试输出的意义2.3 为什么需要去掉换行符? 三、指令切割补充知识: strtok 的函数原型 四、普通命令的执行代码功能概…...
SSRF服务端请求伪造
SSRF:服务端请求伪造 危害:任意文件读取、任意服务探测(通过端口来探测) 例:探测3306端口,看mysql服务是否开启,再通过文件读取,获得mysql配置文件 例:当我们点击链接…...
LVGL的三层屏幕结构
文章目录 🌟 LVGL 的三层屏幕架构1. **Top Layer(顶层)**2. **System Layer(系统层)**3. **Active Screen(当前屏幕层)** 🧠 总结对比🔍 整体作用✅ 普通屏幕层对象&…...
使用互斥锁保护临界
Linux线程互斥及相关概念解析 1. 临界资源(Critical Resource) 定义:被多个线程共享的资源(如变量、文件、内存区域等),需通过互斥访问确保数据一致性。特点: 共享性:多个线程可能…...
5.8线性动态规划2
P1004 [NOIP 2000 提高组] 方格取数 做法1:DFS剪枝 #include<bits/stdc.h> using namespace std; int n, a[10][10], maxs, minx 11, miny 11, maxx, maxy; void dfs(int x, int y, int s, int type){if(type 1 && x minx && y miny){…...
linux系统Ubuntn界面更改为中文显示,配置流程
Linux 系统是一种开源的、多用户的、多任务的操作系统,具有高度的稳定性、安全性和灵活性,被广泛应用于服务器、嵌入式系统、科研、教育以及个人电脑等领域。以下是关于 Linux 系统的一些基本信息: 发展历程:Linux 的发展始于 19…...
Looper死循环阻塞为什么没有ANR
Looper 死循环阻塞没有 ANR 的原因在于 ANR (Application Not Responding) 的检测机制依赖于特定线程的事件处理超时。以下是详细解释: 1. ANR 的触发机制: 主线程 (UI 线程) 阻塞: ANR 最常见的情况是主线程阻塞。Android 系统会监控主线程…...
数字孪生陆上风电场可视化管理系统
图扑软件搭建陆上风电场数字孪生平台,通过高精度建模与实时数据采集,1:1 还原风机设备、输电网络及场区环境。动态展示风机运行参数、发电量、设备健康状态等信息,实现风电场运维管理的智能化、可视化与高效化。...
图像处理篇---MJPEG视频流处理
文章目录 前言一、MJPEG流基础概念MJPEG流特点格式简单无压缩时序HTTP协议传输边界标记 常见应用场景IP摄像头视频流嵌入式设备(如ESP32)视频输出简单视频监控系统 二、基础处理方法方法1:使用OpenCV直接读取优点缺点 方法2:手动解…...
ensp的华为小实验
1.先进行子网划分 2.进行接口的IP地址配置和ospf的简易配置,先做到全网小通 3.进行ospf优化 对区域所有区域域间路由器进行一个汇总 对区域1进行优化 对区域2.3进行nssa设置 4.对ISP的路由进行协议配置 最后ping通5.5.5.5...
webpack和vite区别
webpack将文件视为模块打包 ,从入口文件递归解析依赖,生成依赖图,使用loader处理非JS模块,最终输出到dist目录 因为要解析所有依赖,所以他启动慢 vite利用浏览器对于es模块的原生支持,利用ESM能力&#x…...
从父类到子类:C++ 继承的奇妙旅程(2)
前言: 各位代码航海家,欢迎回到C继承宇宙!上回我们解锁了继承的「基础装备包」,成功驯服了public、protected和花式成员隐藏术。但—— ⚠️前方高能预警: 继承世界的暗流涌动远不止于此!今天我们将勇闯三大…...
ScaleTransition 是 Flutter 中的一个动画组件,用于实现缩放动画效果。
ScaleTransition 是 Flutter 中的一个动画组件,用于实现缩放动画效果。它允许你对子组件进行动态的缩放变换,从而实现平滑的动画效果。ScaleTransition 通常与 AnimationController 和 Tween 一起使用,以控制动画的开始、结束和过渡效果。 基…...
部署RocketMQ
部署环境:jdk8以上,Linux系统 下载和安装指令: wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功: --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…...
从爬虫到网络---<基石9> 在VPS上没搞好Docker项目,把他卸载干净
1.停止并删除所有正在运行的容器 docker ps -a # 查看所有容器 docker stop $(docker ps -aq) # 停止所有容器 docker rm $(docker ps -aq) # 删除所有容器如果提示没有找到容器,可以忽略这些提示。 2.删除所有镜像 docker images # 查看所有镜像 dock…...
每日c/c++题 备战蓝桥杯(P2241 统计方形(数据加强版))
洛谷P2241 统计方形(数据加强版)题解 题目描述 给定一个 n m n \times m nm 的方格棋盘,要求统计其中包含的正方形数量和长方形数量(不包含正方形)。输入为两个正整数 n n n 和 m m m,输出两个整数分…...
LLaVA:开源多模态大语言模型深度解析
一、基本介绍 1.1 项目背景与定位 LLaVA(Large Language and Vision Assistant)是由Haotian Liu等人开发的开源多模态大语言模型,旨在实现GPT-4级别的视觉-语言交互能力。该项目通过视觉指令微调技术,将预训练的视觉编码器与语言模型深度融合,在多个多模态基准测试中达到…...
基于Spring Boot + Vue的母婴商城系统( 前后端分离)
一、项目背景介绍 随着母婴行业在互联网平台的快速发展,越来越多的家庭倾向于在线选购母婴产品。为了提高商品管理效率和用户购物体验,本项目开发了一个基于 Spring Boot Vue 技术栈的母婴商城系统,实现了商品分类、商品浏览、资讯展示、评…...
HNUST湖南科技大学-软件测试期中复习考点(保命版)
使用说明:本复习考点仅用于及格保命。软件测试和其他专业课不太一样,记忆的太多了,只能说考试的时候,想到啥就写啥,多写一点!多写一点!多写一点!(重要事情说三遍…...
【AI智能推荐系统】第七篇:跨领域推荐系统的技术突破与应用场景
第七篇:跨领域推荐系统的技术突破与应用场景 提示语:🔥 “打破数据孤岛,实现1+1>2的推荐效果!深度解析美团、亚马逊如何用跨领域推荐技术实现业务协同,知识迁移核心技术全公开!” 目录 跨领域推荐的商业价值跨领域推荐技术体系 2.1 基于共享表征的学习2.2 迁移学习…...
【现代深度学习技术】注意力机制04:Bahdanau注意力
【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上,结合当代大数据和大算力的发展而发展出来的。深度学习最重…...
使用FastAPI和React以及MongoDB构建全栈Web应用01 概述
Are you ready to craft digital experiences that captivate and convert? 您准备好打造令人着迷并能带来转变的数字体验了吗? In a world driven by innovation, the demand for robust and scalable web applications has never been higher. Whether you’re…...
Flutter - UIKit开发相关指南 - 概览
环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 概览 UIView与Widgets的比较 在UIKit使用UIView类的对象进行页面开发,布局也是UIView类的对象,在Flutter中使用的是Widget,在概念上Widget可以理解成UIView。 差异: 有效期: Widgets是不可变的,它的生存期只…...
扩容 QCOW2 磁盘镜像文件
🌈 个人主页:Zfox_ 目录 ✅ 一、扩展 QCOW2 文件大小✅ 二、启动虚拟机后扩展分区和文件系统方式一:如果使用的是标准分区(如 /dev/vda1)方式二:使用 gparted(图形工具) ✅ 总结 &am…...
【ts】for in对象时,ts如何正确获取对应的属性值
第一种:for…in keyof:适合需要遍历对象属性键并动态访问值的场景。 keyof typeof obj是ts的类型操作符,用于获取对象obj的所有属性键的联合类型(“name” | “age” | “city”)通过obj[key keyof typeof obj]&…...