深入解析Java集合框架:List集合及其实现类的应用与原理
================================
|| 持续分享系列教程,关注一下不迷路 ||
|| B站视频教程:墨轩大楼 ||
|| 知识星球:墨轩编程自习室 ||
================================
Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一系列接口和实现类来帮助开发者高效地管理和操作数据。List
接口作为集合框架中的重要一员,代表了一个有序的元素序列,允许重复元素,并且每个元素都有一个确切的位置。本文将深入探讨List
接口及其主要实现类——ArrayList
, LinkedList
, 和 Vector
(包括其子类Stack
),从它们的应用场景、优缺点到底层实现原理进行全面解析,并通过详细的代码示例展示如何进行增删改查操作。
一、Java集合框架简介
Java集合框架位于java.util
包下,主要包括以下几种类型的接口:
- Collection:代表一组对象,可以包含重复元素。
- Set:不包含重复元素的
Collection
。 - List:有序的
Collection
,可以包含重复元素。 - Queue:通常用来表示一个先进先出 (FIFO) 的队列。
- Map:键值对的映射关系。
本文重点讨论List
接口及其主要实现类。
二、 List接口概述
List
接口继承自Collection
接口,是一个有序的集合,允许重复元素。List
接口的主要方法包括:
add(E e)
:在列表末尾添加元素。get(int index)
:获取指定位置的元素。set(int index, E element)
:替换指定位置的元素。remove(int index)
:移除指定位置的元素。size()
:返回列表中的元素数量。isEmpty()
:判断列表是否为空。contains(Object o)
:判断列表是否包含指定元素。iterator()
:返回一个迭代器用于遍历列表。
2.1. ArrayList
ArrayList
是List
接口的一个实现类,基于动态数组实现。它提供了快速的随机访问能力,但插入和删除操作可能会导致大量的元素移动。
2.1.1 应用场景
- 当需要支持快速随机访问时。
- 存储固定数量的元素,或者插入和删除操作较少时。
- 不需要线程安全的情况下。
2.1.2 优点
- 提供了快速的随机访问能力,时间复杂度为O(1)。
- 在内存连续区域存储元素,适合大量数据的读取。
- 实现简单,易于理解和使用。
2.1.3 缺点
- 插入和删除操作可能导致大量的元素移动,平均时间复杂度为O(n)。
- 不适合频繁插入或删除元素的情况。
- 线程不安全,需要外部同步机制来保证线程安全。
2.1.4 底层实现原理
ArrayList
内部使用一个可变大小的数组来存储元素。- 初始容量默认为10,当数组满时,会创建一个新的更大的数组,并将旧数组中的元素复制到新数组中。
- 数组的容量增长策略通常是增加50%。
2.1.5 示例代码
import java.util.ArrayList;
import java.util.List;public class ArrayListExample {public static void main(String[] args) {// 创建一个ArrayList实例List<String> list = new ArrayList<>();// 增加元素list.add("Apple");list.add("Banana");list.add("Cherry");// 获取元素System.out.println("Element at index 0: " + list.get(0)); // 输出 "Apple"// 修改元素list.set(1, "Blueberry"); // 将第二个元素修改为 "Blueberry"System.out.println("Modified list: " + list); // 输出 [Apple, Blueberry, Cherry]// 删除元素list.remove(2); // 删除第三个元素System.out.println("After removing element at index 2: " + list); // 输出 [Apple, Blueberry]// 遍历列表for (String fruit : list) {System.out.println(fruit);}}
}
2.2. LinkedList
LinkedList
也是List
接口的一个实现类,基于双向链表实现。它支持高效的插入和删除操作,但随机访问效率较低。
2.2.1 应用场景
- 当需要频繁地进行插入和删除操作时。
- 实现栈和队列等数据结构时。
- 不需要线程安全的情况下。
2.2.2 优点
- 插入和删除操作的时间复杂度为O(1),因为只需要改变前后节点的链接。
- 双向链表结构使得从头到尾或从尾到头遍历都非常高效。
- 支持高效的插入和删除操作。
2.2.3 缺点
- 随机访问效率较低,时间复杂度为O(n)。
- 占用更多的内存空间,因为每个节点都需要额外的空间来存储指针。
- 线程不安全,需要外部同步机制来保证线程安全。
2.2.4 底层实现原理
LinkedList
内部使用双向链表实现,每个节点除了存储数据外,还包含两个指针分别指向下一个节点和上一个节点。- 头节点和尾节点的引用被维护在
LinkedList
类中,这使得添加和移除操作非常高效。 - 通过维护头尾节点,可以实现快速的头尾插入和删除操作。
2.2.5 示例代码
import java.util.LinkedList;
import java.util.List;public class LinkedListExample {public static void main(String[] args) {// 创建一个LinkedList实例List<String> list = new LinkedList<>();// 增加元素list.add("Apple");list.add("Banana");list.addFirst("Cherry"); // 在头部添加list.addLast("Date"); // 在尾部添加// 获取元素System.out.println("First element: " + list.getFirst()); // 输出 "Cherry"System.out.println("Last element: " + list.getLast()); // 输出 "Date"// 修改元素list.set(1, "Blueberry"); // 将第二个元素修改为 "Blueberry"System.out.println("Modified list: " + list); // 输出 [Cherry, Blueberry, Apple, Date]// 删除元素list.removeFirst(); // 移除第一个元素list.removeLast(); // 移除最后一个元素System.out.println("After removing first and last elements: " + list); // 输出 [Blueberry, Apple]// 遍历列表for (String fruit : list) {System.out.println(fruit);}}
}
2.3. Vector
Vector
是List
接口的一个实现类,类似于ArrayList
,但它提供了线程安全的特性。所有公共方法都是同步的,因此可以直接在多线程环境中使用。
2.3.1 应用场景
- 在单线程环境下,如果不需要线程安全,则应避免使用。
- 在多线程环境下,如果需要保证线程安全,可以考虑使用。
2.3.2 优点
- 由于所有的公共方法都是同步的,因此可以直接在多线程环境中使用。
- 提供了类似
ArrayList
的功能,同时保证了线程安全。
2.3.3 缺点
- 性能较差,尤其是在高并发环境下,因为每次操作都涉及锁的获取和释放。
- 已经被
ArrayList
和Collections.synchronizedList
所取代。 - 占用更多的内存空间,因为需要维护额外的同步机制。
2.3.4 底层实现原理
Vector
内部使用一个可变大小的数组来存储元素。- 数组的初始容量默认为10,当数组满时,会创建一个新的更大的数组,并将旧数组中的元素复制到新数组中。
- 数组的容量增长策略通常是增加100%。
- 所有公共方法都是同步的,确保了线程安全。
2.3.5 示例代码
import java.util.Vector;public class VectorExample {public static void main(String[] args) {// 创建一个Vector实例Vector<String> vector = new Vector<>();// 增加元素vector.add("Apple");vector.add("Banana");vector.addElement("Cherry"); // 向末尾添加元素vector.insertElementAt("Date", 1); // 在指定位置插入元素// 获取元素System.out.println("First element: " + vector.firstElement()); // 输出 "Apple"System.out.println("Element at index 1: " + vector.elementAt(1)); // 输出 "Date"// 修改元素vector.set(1, "Blueberry"); // 将第二个元素修改为 "Blueberry"System.out.println("Modified vector: " + vector); // 输出 [Apple, Blueberry, Banana, Cherry]// 删除元素vector.removeElementAt(2); // 移除指定位置的元素System.out.println("After removing element at index 2: " + vector); // 输出 [Apple, Blueberry, Cherry]// 遍历列表for (String fruit : vector) {System.out.println(fruit);}}
}
2.4. Stack
Stack
是Vector
的一个子类,实现了后进先出 (LIFO) 的栈结构。虽然Stack
已经过时,但在某些情况下仍然有用。
2.4.1 应用场景
- 实现简单的栈结构。
- 在单线程环境下,如果不需要线程安全,则应避免使用。
- 在多线程环境下,如果需要保证线程安全,可以考虑使用。
2.4.2 优点
- 提供了栈的基本操作,如
push
,pop
,peek
等。 - 基于
Vector
实现,因此继承了Vector
的所有功能。
2.4.3 缺点
- 已经过时,推荐使用
Deque
接口的实现类,如ArrayDeque
。 - 性能较差,尤其是在高并发环境下,因为每次操作都涉及锁的获取和释放。
- 占用更多的内存空间,因为需要维护额外的同步机制。
2.4.4 底层实现原理
Stack
基于Vector
实现,内部使用一个可变大小的数组来存储元素。- 所有公共方法都是同步的,确保了线程安全。
- 提供了栈的基本操作,如
push
,pop
,peek
等。
2.4.5 示例代码
import java.util.Stack;public class StackExample {public static void main(String[] args) {// 创建一个Stack实例Stack<String> stack = new Stack<>();// 增加元素stack.push("Apple");stack.push("Banana");stack.push("Cherry");// 查看栈顶元素System.out.println("Top element: " + stack.peek()); // 输出 "Cherry"// 修改栈顶元素stack.pop(); // 移除并返回栈顶元素stack.push("Blueberry"); // 添加新的栈顶元素System.out.println("Modified stack: " + stack); // 输出 [Apple, Banana, Blueberry]// 删除元素while (!stack.isEmpty()) {System.out.println("Popped: " + stack.pop());}// 遍历栈for (String fruit : stack) {System.out.println(fruit);}}
}
四. 总结
List
接口的不同实现类各有优劣,选择合适的实现类取决于具体的业务需求。ArrayList
适用于需要快速随机访问的场景;LinkedList
更适合于需要频繁插入和删除元素的情况;而Vector
则是在多线程环境中需要线程安全时的一个选项。理解这些集合背后的实现机制有助于更好地利用它们的优势并避免潜在的问题。
相关文章:
深入解析Java集合框架:List集合及其实现类的应用与原理
|| 持续分享系列教程,关注一下不迷路 || || B站视频教程:墨轩大楼 || || 知识星球:墨轩编程自习室 || Java集合框架是Java编程语言中一个非常重要的组成部分,…...
MySQL需掌握到何种程度?才能胜任工作
大家好,我是袁庭新。星友问:MySQL需要学到什么程度?才能胜任日常的软件开发工作呢!以下是一些建议的学习目标和程度,这些目标旨在帮助你在工作中高效地使用MySQL。 数据库的基本概念、MySQL的安装及配置、SQL的概念、S…...
如何使用brew安装phpredis扩展?
如何使用brew安装phpredis扩展? phpredis扩展是一个用于PHP语言的Redis客户端扩展,它提供了一组PHP函数,用于与Redis服务器进行交互。 1、cd到php某一版本的bin下 /usr/local/opt/php8.1/bin 2、下载 phpredis git clone https://githu…...
力扣hot100道【贪心算法后续解题方法心得】(三)
力扣hot100道【贪心算法后续解题方法心得】 十四、贪心算法关键解题思路1、买卖股票的最佳时机2、跳跃游戏3、跳跃游戏 | |4、划分字母区间 十五、动态规划什么是动态规划?关键解题思路和步骤1、打家劫舍2、01背包问题3、完全平方式4、零钱兑换5、单词拆分6、最长递…...
时间同步服务器--Linux中
时间同步服务器 1. 时间同步服务 时间同步:多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,如:加密协议,日志,集群等,利用NTP(Network Time Protocol )协议使网络中的各…...
银河麒麟V10-SP1设置redis开机自启
前言: redis安装请看:银河麒麟V10-SP1离线安装redis5.0.1_银河麒麟v10 redis5.0-CSDN博客 一、编辑自启文件 vim /etc/systemd/system/redis.service [Unit] DescriptionRedis In-Memory Data Store Afternetwork.target [Service] Typeforking ExecS…...
JVM 之垃圾回收器
一、GC 的分类 1.1 串行 VS 并行 串行回收:指在同一时间段内只允许有一个 CPU 用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾回收结束 在单 CPU 处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的超过并…...
基于Java Springboot宠物咖微信小程序
一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信开发者工具 数…...
求助——AssertionError: Attribute pipeline is missing from configuration.json.
我在本地运行Sunsimiao大模型的时候遇到了“AssertionError: Attribute pipeline is missing from configuration.json.”的问题。在网上找了很多问题都没有解决,求助一下广大网友。有什么好的解决方法吗? 本地环境如上所示,不知是哪里出…...
LearnOpenGL学习(光照 -- 颜色,基础光照,材质,光照贴图)
光照 glm::vec3 lightColor(0.0f, 1.0f, 0.0f); glm::vec3 toyColor(1.0f, 0.5f, 0.31f); glm::vec3 result lightColor * toyColor; // (0.0f, 0.5f, 0.0f); 说明:当我们把光源的颜色与物体的颜色值相乘,所得到的就是这个物体所反射的颜色。 创建…...
vulnhub靶场【哈利波特】三部曲之Aragog
前言 使用virtual box虚拟机 靶机:Aragog : 192.168.1.101 攻击:kali : 192.168.1.16 主机发现 使用arp-scan -l扫描,在同一虚拟网卡下 信息收集 使用nmap扫描 发现22端口SSH服务,openssh 80端口HTTP服务,Apach…...
【开发语言】层次状态机(HSM)介绍
层次状态机(Hierarchical State Machine, HSM),从基本原理、结构设计、实现方法以及如何结合 Qt 进行具体实现等方面进行分析。 1. 层次状态机的基本原理 层次状态机是一种用于管理复杂系统行为的状态机模型,它通过将状态组织成…...
Midjourney Imagine API 申请及使用
Midjourney Imagine API 申请及使用 Midjourney 是一款非常强大的 AI 绘图工具,只要输入关键字,就能在短短一两分钟生成十分精美的图像。Midjourney 以其出色的绘图能力在业界独树一帜,如今,Midjourney 早已在各个行业和领域广泛…...
Function Arguments and Function Parameters (函数的实参和函数的形参)
Function Arguments and Function Parameters {函数的实参和函数的形参} 1. Object-Oriented Programming Using C2. Function Arguments and Function ParametersReferences 1. Object-Oriented Programming Using C https://icarus.cs.weber.edu/~dab/cs1410/textbook/index…...
【C语言】递归的内存占用过程
递归 递归是函数调用自身的一种编程技术。在C语言中,递归的实现会占用内存栈(Call Stack),每次递归调用都会在栈上分配一个新的 “栈帧(Stack Frame)”,用于存储本次调用的函数局部变量、返回地…...
六、文本搜索工具(grep)和正则表达式
一、grep工具的使用 1、概念 grep: 是 linux 系统中的一个强大的文本搜索工具,可以按照 正则表达式 搜索文本,并把匹配到的行打印出来(匹配到的内容标红)。 2、语法 grep [options]…… pattern [file]…… 工作方式…...
spaCy 入门与实战:强大的自然语言处理库
spaCy 入门与实战:强大的自然语言处理库 spaCy 是一个现代化、工业级的自然语言处理(NLP)库,以高效、易用和功能丰富著称。它被广泛应用于文本处理、信息提取和机器学习任务中。本文将介绍 spaCy 的核心功能,并通过一…...
嵌入式硬件实战提升篇(三)商用量产电源设计方案 三路电源输入设计 电源管理 多输入供电自动管理 DCDC降压
引言:本文你能实际的了解到实战量产产品中电源架构设计的要求和过程,并且从实际实践出发搞懂电源架构系统,你也可以模仿此架构抄板到你自己的项目,并结合硬件篇之前的项目以及理论形成正真的三路电源输入设计与开发板电源架构块供…...
常用排查工具使用
1.spy++ Microsoft Spy++是一个非常好的查看Windows操作系统的窗口、消息、进程、线程信息的工具,简单易用,功能强大。 在vs的工具中默认安装,还可以监控到隐层窗口,通过查看窗口的属性可以获得更多信息,包括规格、窗口、类、进程等信息,可以帮助排查相关窗口的问题。 2…...
用三维模型的顶点法向量计算法线贴图
法线贴图的核心概念是在不增加额外多边形数目的情况下,通过模拟细节来改善光照效果。具体流程包括: 法线的计算与存储:通过法线映射将三维法线向量转化为法线贴图的 RGB 值。渲染中的使用:在片段着色器中使用法线贴图来替代原有的…...
基于Matlab高速动车组转臂定位橡胶节点刚度对车辆动力学影响仿真研究
本研究针对高速动车组转臂定位系统中橡胶节点的刚度对车辆动力学性能的影响进行仿真研究。随着高速铁路的发展,动车组的运行稳定性和舒适性成为设计和运营的核心问题,其中,转臂定位系统作为动车组悬挂系统的重要组成部分,其性能对…...
PostgreSQL认证培训需要什么条件
PostgreSQL认证培训通常没有严格的前置条件,但以下几点可以帮助你更好地准备和通过认证考试: 1、基础知识:具备基本的数据库知识和经验,特别是对SQL有一定的了解。如果你Oracle、MySQL等基础知识,对对你学习PostgreSQ…...
Rust 图形界面开发——使用 GTK 创建跨平台 GUI
第五章 图形界面开发 第一节 使用 GTK 创建跨平台 GUI GTK(GIMP Toolkit)是一个流行的开源跨平台图形用户界面库,适用于创建桌面应用程序。结合 Rust 的 gtk-rs 库,开发者能够高效地构建现代化 GUI 应用。本节将详细探讨 GTK 的…...
Spring中每次访问数据库都要创建SqlSession吗?
一、SqlSession是什么二、源码分析1)mybatis获取Mapper流程2)Spring创建Mapper接口的代理对象流程3)MapperFactoryBean#getObject调用时机4)SqlSessionTemplate创建流程5)SqlSessionInterceptor拦截逻辑6)开…...
【数据分析】布朗运动(维纳过程)
文章目录 一、概述二、数学布朗运动2.1 数学定义2.2 布朗运动的数学模型2.21 标准布朗运动2.22 布朗运动的路径2.23 布朗运动的方程 三、布朗运动在金融学中的应用四、数学构造(以傅里叶级数为例)4.1 傅里叶级数的基本思想4.2 构造布朗运动 一、概述 布…...
静态页面 和 动态页面(Java Web开发)
1. 静态页面 1.1 什么是静态页面? 静态页面是指 HTML 文件直接存放在服务器上,不依赖后端逻辑处理而生成内容。客户端浏览器请求静态页面时,服务器直接将文件发送到客户端,浏览器负责渲染页面。 特点: 固定内容&am…...
linux模拟试题
Linux 基础阶段考试笔试模拟试卷 审核人:王旺旺 一.填空题(每题 1 分,共 30 分) 1.验证 httpd 服务是否启动的命令是_______ 答:systemctl status httpd 或 netstat -anptl 或 ss -anpt 2.将目录 xxhf 下所有文件的所属组改为 user1 的命令是_______ 答:chown -R ,user1 …...
Android 使用OpenGLES + MediaPlayer 获取视频截图
概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类,用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2(api8)之后新增的一个,该类为…...
典型的1553B网络
典型的1553B网络 1553B总线BUS A和BUS B是互为冗余的、完全对等、物理隔离的两个网络。每一个节点设备也配置有互为冗余的A、B两个1553B接口,分别接入BUS A和BUS B。系统完成初始化配置后,首先采用BUS A来通讯。工作过程中,如果发现BUS A的工…...
【C++】内存管理
【C】内存管理 一、C/C内存分布二、C语言中动态内存管理方式三、C内存管理方式1、new 和 delete 操作内置类型2、new 和 delete 操作自定义类型 四、operator new 和 operator delete 函数五、new 和 delete 的实现原理1、内置类型2、自定义类型3、new和delete不匹配的报错 六、…...
实现PDF文档加密,访问需要密码
01. 背景 今天下午老板神秘兮兮的来问我,能不能做个文档加密功能,就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了,那必须可以。 需求:将 pdf 文档经过加密处理,客户下载pdf文档,打开文档需…...
常见排序算法总结 (三) - 归并排序与归并分治
归并排序 算法思想 将数组元素不断地拆分,直到每一组中只包含一个元素,单个元素天然有序。之后用归并的方式收集跨组的元素,最终形成整个区间上有序的序列。 稳定性分析 归并排序是稳定的,拆分数组时会自然地将元素分成有先后…...
文库 | 从嬴图的技术文档聊起
在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它是知识传承的载体,是团队协作的桥梁,更是产品成功的幕后英雄。然而,打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼?是否纠结…...
故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab)
效果一览 文章概述 故障诊断 | Transformer-LSTM组合模型的故障诊断(Matlab) 源码设计 %% 初始化 clear close all clc disp(此程序务必用2023b及其以上版本的MATLAB!否则会报错!) warning off %...
VScode离线下载扩展安装
在使用VScode下在扩展插件时,返现VScode搜索不到插件,网上搜了好多方法,都不是常规操作,解决起来十分麻烦,可以利用离线下载安装的方式安装插件!亲测有效!!! 1.找到VScod…...
【AI系统】昇腾异构计算架构 CANN
昇腾异构计算架构 CANN 本文将介绍昇腾 AI 异构计算架构 CANN(Compute Architecture for Neural Networks),这是一套为高性能神经网络计算需求专门设计和优化的架构。CANN 包括硬件层面的达芬奇架构和软件层面的全栈支持,旨在提供…...
云服务器重装系统后 一些报错与解决[ vscode / ssh / 子用户]
碰见的三个问题: 1.vscode连接失败 2.登录信息配置 3.新建子用户的一些设置 思考:遇见问题,第一反应 应该如何解决 目录 1. 错误 解决方法 原因 步骤 1:找到known_hosts文件并编辑 步骤 2:通过VSCode终端输入…...
架构设计之路,永无尽头
1. 插件式架构 2. SRP:单一职责原则 3. 链接加载器??? 4. 端口适配器架构 5. 六边形架构 6. MVC架构 7. 领域驱动架构 8. 敏捷开发 9. 打台球的时候每打一杆是为了下几杆,而不是为了打到洞中。 10. 画出一个图࿰…...
【AI系统】Ascend C 语法扩展
Ascend C 语法扩展 Ascend C 的本质构成其实是标准 C加上一组扩展的语法和 API。本文首先对 Ascend C 的基础语法扩展进行简要介绍,随后讨论 Ascend C 的两种 API——基础 API 和高阶 API。 接下来针对 Ascend C 的几种关键编程对象——数据存储、任务间通信与同步…...
驱动篇的开端
准备 在做之后的动作前,因为win7及其以上的版本默认是不支持DbgPrint(大家暂时理解为内核版的printf)的打印,所以,为了方便我们的调试,我们先要修改一下注册表 创建一个reg文件然后运行 Windows Registr…...
树莓派4B使用opencv读取摄像头配置指南
本文自己记录,给我们lab自己使用,其他朋友们不一定完全适配,请酌情参考。 一. 安装opecnv 我们的树莓派4B默认是armv7l架构,安装的miniconda最新的版本 Miniconda3-latest-Linux-armv7l.sh 仍然是python3.4几乎无法使用ÿ…...
【AI日记】24.12.03 kaggle 比赛 Titanic-6
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容:学习 kaggle 入门比赛 Titanic - Machine Learning from Disaster时间:7 小时评估:继续 读书 书名:美丽新世界时间:1 小时阅读原因&…...
Linux中的常用基本指令(下)
Linux常用基本指令 Linux中的基本指令12.head指令13.tail指令简单解释重定向与管道(重要) 14.date指令(时间相关的指令)15.cal指令(不重要)16.find指令(灰常重要)17.grep指令(重要)18.which指令和alias指令19.zip/unzip指令:20.tar指令(重要&…...
python笔记3
复习及总结 python的软件安装及简单使用——python3.31 pycharm python的输出:print() 简单(直接)输出 print()输出到指定文件 fpopen(rC:\Users\M15R3\Desktop\1.txt,a) print("334…...
电商营销活动-抽奖业务
目录 一、抽奖系统的核心功能 二、抽奖系统的业务逻辑 三、抽奖系统的业务优势 四、抽奖系统的业务注意事项 电商营销活动中的抽奖系统业务,是一种通过设立抽奖活动来吸引用户参与、提升用户活跃度和转化率的营销手段。以下是对电商营销活动抽奖系统业务的详细解…...
利用 Redis 与 Lua 脚本解决秒杀系统中的高并发与库存超卖问题
1. 前言 1.1 秒杀系统中的库存超卖问题 在电商平台上,秒杀活动是吸引用户参与并提升销量的一种常见方式。秒杀通常会以极低的价格限量出售某些商品,目的是制造紧迫感,吸引大量用户参与。然而,这种活动的特殊性也带来了许多技术挑…...
《山海经》:北山
《山海经》:北山 北山一经单狐山求如山(水马:形状与马相似,滑鱼:背部红色)带山(䑏疏:似马,一只角,鵸鵌:状乌鸦五彩斑斓,儵鱼ÿ…...
React基础教程(12):useRef的使用
12、useRef useRef 是 React 中的一个 Hook,主要用于访问和操作 DOM 元素以及保存组件的可变引用值。它是一个工具,用来避免重新渲染组件的情况下保持某些状态或引用的值。 使用场景: 使用场景 访问 DOM 元素 当需要直接操作某个 DOM 元素(如聚焦、滚动等)时,可以使用…...
释放超凡性能,打造鸿蒙原生游戏卓越体验
11月26日在华为Mate品牌盛典上,全新Mate70系列及多款全场景新品正式亮相。在游戏领域,HarmonyOS NEXT加持下游戏的性能得到充分释放。HarmonyOS SDK为开发者提供了软硬协同的系统级图形加速解决方案——Graphics Accelerate Kit(图形加速服务…...
Linux--Debian或Ubuntu上扩容、挂载磁盘并配置lvm
一、三块12TB组RAID 5 可用容量约24TB 二、安装LVM工具(已安装请忽略) sudo apt-get install lvm2二、查看可用磁盘 sudo lsblk 或者 sudo fdisk -l三、创建物理卷(PV) 选中刚做的磁盘组 sudo pvcreat /dev/sdb1四、创建卷组…...