当前位置: 首页 > news >正文

java 常量池详解

目录

  • java 常量池详解
    • 一 静态常量池(Static Constant Pool)
      • 1.1 概述
      • 1.2 存储内容
      • 1.3 特点
      • 1.4 示例
    • 二 运行时常量池(Runtime Constant Pool)
      • 2.1 概述
      • 2.2 存储内容
      • 2.3 特点
      • 2.4 示例
    • 三 基础类型常量池(Primitive Type Constant Pool)
      • 3.1 概述
      • 3.2 存储内容
      • 3.3 特点
      • 3.4 示例
      • 3.5 JVM 参数调整缓存范围
    • 四 字符串常量池(String Constant Pool)
      • 4.1 概述
      • 4.2 特点
      • 4.3 存储内容
      • 4.4 工作机制
        • 1. 字符串字面量
        • 2. `String.intern()` 方法
      • 4.5 优点
      • 4.6 注意事项
    • 五 常量池的关系与区别
    • 六 总结

java 常量池详解

在 Java JVM(以 JDK 11 为例)中,常量池是优化内存使用和提高性能的重要机制。常量池主要包括静态常量池运行时常量池基础类型常量池字符串常量池。以下将对这四种常量池进行详细整理和介绍。


一 静态常量池(Static Constant Pool)

1.1 概述

静态常量池是指每个 .class 文件中包含的常量池部分,由 Java 编译器在编译时生成。它主要用于存储在编译期间已知的各种字面量和符号引用。

1.2 存储内容

  1. 字面量(Literals):
    • 数值字面量:如 intlongfloatdoublecharboolean 的常量值。
    • 字符串字面量:如 "Hello World"
  2. 符号引用(Symbolic References):
    • 类或接口的全限定名:如 java/lang/String
    • 字段的名称和描述符:如 ageI(表示 int 类型)。
    • 方法的名称和描述符:如 main([Ljava/lang/String;)V

1.3 特点

  • 编译期生成:静态常量池在编译时就已经确定,并存储在 .class 文件中。
  • 不可变性:一旦编译完成,静态常量池中的内容不可更改。
  • 类级别:每个类文件对应一个静态常量池,多个类文件拥有各自独立的静态常量池。

1.4 示例

假设有如下 Java 类:

public class Example {private static final int CONSTANT_INT = 100;private static final String CONSTANT_STRING = "Hello";public static void main(String[] args) {System.out.println(CONSTANT_INT);System.out.println(CONSTANT_STRING);}
}

在编译后的 Example.class 文件中,静态常量池会包含:

  • 整数 100
  • 字符串 "Hello"
  • java/lang/System
  • 字段 outprintln 方法的符号引用

二 运行时常量池(Runtime Constant Pool)

2.1 概述

运行时常量池是 JVM 在类加载后,静态常量池的一个运行时表示。它是方法区的一部分(在 JDK 8 及之后版本中,属于元空间 Metaspace),用于在程序运行时管理和使用常量。

2.2 存储内容

  1. 来自静态常量池的内容:
    • 字面量(如数值、字符串)。
    • 符号引用解析后的直接引用(如指向内存地址的指针)。
  2. 动态生成的内容:
    • 通过 String.intern() 方法动态添加的字符串。
    • 动态语言的元数据(如在 JVM 上运行的动态语言)。

2.3 特点

  • 动态性:可以在运行时动态添加新的常量,如通过 intern() 方法。
  • 内存位置:在 JDK 8 及之后版本中,运行时常量池位于堆内存的元空间中。
  • 生命周期:与类的生命周期相关,类被卸载时,常量池也会被回收。

2.4 示例

public class RuntimePoolTest {public static void main(String[] args) {String str1 = "Hello"; // 静态常量String str2 = new String("Hello").intern(); // 动态添加到运行时常量池}
}

在上述代码中:

  • "Hello" 是编译时的字符串字面量,已存在于静态常量池。
  • str2 通过 intern() 方法将 "Hello" 的引用添加到运行时常量池。

三 基础类型常量池(Primitive Type Constant Pool)

3.1 概述

基础类型常量池主要针对 Java 中的基本数据类型(如 intlong 等)以及其对应的包装类(如 IntegerLong 等),用于优化内存使用和提高性能。

3.2 存储内容

  1. 基本数据类型的常量值:
    • 如整数 1、浮点数 3.14、字符 'A'、布尔值 true 等。
  2. 包装类的缓存对象:
    • 包装类如 IntegerLongShortByteCharacterBoolean 提供了缓存机制,存储常用的常量值。

3.3 特点

  • 缓存机制:包装类会缓存一定范围内的常量对象,以减少内存开销和提升性能。

  • 范围限制

    • IntegerLong:默认缓存范围是 -128127
    • ShortByte:所有值都在缓存范围内。
    • Character:缓存范围是 \u0000\u007F(即 0127)。
    • Boolean:只有 truefalse 两个值被缓存。
  • 可调整性:某些包装类的缓存范围可以通过 JVM 参数进行调整(如 Integer 的缓存上限)。

3.4 示例

public class PrimitiveConstantPoolTest {public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b); // true,引用同一个缓存对象System.out.println(c == d); // false,超出缓存范围,创建新对象}
}

在上述代码中:

  • ab 都被自动装箱为 Integer 类型,且值在缓存范围内,因此引用同一个对象。
  • cd 的值超出默认缓存范围,因此分别创建了不同的对象。

3.5 JVM 参数调整缓存范围

对于 Integer,可以通过以下 JVM 参数调整缓存上限:

-Djava.lang.Integer.IntegerCache.high=1000

这会将 Integer 的缓存范围扩展到 -1281000


四 字符串常量池(String Constant Pool)

4.1 概述

字符串常量池是 JVM 中专门用于存储字符串字面量和通过 intern() 方法添加的字符串的区域。其主要目的是为了优化字符串的存储,避免重复创建相同内容的字符串对象,从而节省内存并提高性能。

4.2 特点

  1. 位置
    • JDK 7 及之后版本:字符串常量池位于堆内存中,作为普通对象的一部分。
    • JDK 6 及之前版本:字符串常量池位于方法区(永久代 PermGen)。
  2. 唯一性
    • 常量池中的每个字符串都是唯一的。如果两个字符串内容相同,常量池中只存储一个实例。
  3. 动态性
    • 可以在运行时通过 String.intern() 方法动态添加新的字符串到常量池中。

4.3 存储内容

  • 字符串字面量:如 "Hello""World" 等。
  • 通过 intern() 方法添加的字符串

4.4 工作机制

1. 字符串字面量

当创建字符串字面量时,JVM 会:

  • 检查常量池:首先检查字符串常量池中是否已存在相同内容的字符串。
  • 引用或添加
    • 如果存在,直接引用常量池中的字符串。
    • 如果不存在,将该字符串添加到常量池中。

示例代码

public class StringPoolTest {public static void main(String[] args) {String str1 = "Hello";String str2 = "Hello";System.out.println(str1 == str2); // 输出 true,引用同一个对象}
}
2. String.intern() 方法
  • 功能:将字符串对象的引用添加到常量池中,并返回常量池中的引用。
  • 行为:
    • 如果常量池中已存在相同内容的字符串,则返回该引用。
    • 如果不存在,则将当前字符串添加到常量池中,并返回其引用。

示例代码

public class StringInternTest {public static void main(String[] args) {String str1 = new String("Hello");String str2 = str1.intern();String str3 = "Hello";System.out.println(str1 == str2); // 输出 false,str1 在堆中,str2 引用常量池System.out.println(str2 == str3); // 输出 true,str2 和 str3 引用同一常量池中的字符串}
}

4.5 优点

  1. 节省内存:相同内容的字符串只存储一个实例,减少内存开销。
  2. 提高性能:字符串比较操作更高效,因为可以直接比较引用。

4.6 注意事项

  1. 避免滥用 intern()
    • 频繁调用 intern() 可能导致常量池中过多的字符串,增加内存压力和 GC 负担。
  2. 字符串拼接的优化
    • 编译时拼接:如 "Hello" + "World" 会在编译时优化为 "HelloWorld",直接引用常量池中的字符串。
    • 运行时拼接:如使用 StringBuilder 进行动态拼接,结果字符串默认不在常量池中,需显式调用 intern() 才会被添加。

示例代码

public class StringConcatTest {public static void main(String[] args) {String str1 = "Hello" + "World"; // 编译时优化为 "HelloWorld"String str2 = "HelloWorld";System.out.println(str1 == str2); // 输出 trueString str3 = "Hello";String str4 = str3 + "World"; // 运行时拼接String str5 = "HelloWorld";System.out.println(str4 == str5); // 输出 false}
}

五 常量池的关系与区别

下表总结了静态常量池运行时常量池基础类型常量池字符串常量池的主要区别与联系:

特性静态常量池运行时常量池基础类型常量池字符串常量池
定义位置.class 文件中JVM 的方法区(JDK 8 及后为元空间)运行时常量池的一部分堆内存中的专用区域
生成时间编译时类加载时和运行时编译时和运行时编译时和运行时
存储内容字面量、符号引用静态常量池的内容及运行时生成的新常量基本数据类型的常量值及包装类的缓存对象字符串字面量及通过 intern() 添加的字符串
是否可变不可变可动态扩展基本类型常量不可变,包装类缓存可复用对象可通过 intern() 动态添加
内存管理与类文件生命周期一致与类的生命周期一致,受垃圾回收影响缓存对象存储在堆中,受垃圾回收管理存储在堆中,受垃圾回收管理
主要优化目的减少重复字面量和符号引用的存储管理类加载时的常量,支持动态常量的添加减少包装类对象的创建,提升性能减少重复字符串对象的创建,节省内存

六 总结

在 Java JVM 中,常量池机制通过不同类型的常量池(静态常量池、运行时常量池、基础类型常量池和字符串常量池)优化了内存使用和性能:

  • 静态常量池:在编译时确定,存储类级别的常量和符号引用,存在于每个 .class 文件中。
  • 运行时常量池:在类加载后,静态常量池的运行时表示,可以动态添加常量,位于方法区或元空间中。
  • 基础类型常量池:针对基本数据类型和其包装类,提供缓存机制,减少对象创建,提高性能。
  • 字符串常量池:专门用于存储字符串字面量和通过 intern() 添加的字符串,确保字符串唯一性,节省内存。

相关文章:

java 常量池详解

目录 java 常量池详解一 静态常量池(Static Constant Pool)1.1 概述1.2 存储内容1.3 特点1.4 示例 二 运行时常量池(Runtime Constant Pool)2.1 概述2.2 存储内容2.3 特点2.4 示例 三 基础类型常量池(Primitive Type C…...

aardio —— 虚表 —— 模拟属性框

写了个简单的属性框例程,抛砖引玉,期待你做出更丰富强大的功能。 可折叠行、可输入文本、可下拉选择、支持下拉选择图片、颜色等功能。 只有想不到,没有做不到,发挥你的想象力吧。 import win.ui; import godking.comboboxEx im…...

企业微信——智能表格学习

智能表格 应用限制条件 获取 token https://developer.work.weixin.qq.com/document/10013#%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4 开发步骤 你可以通过以下步骤,使用access_token来访问企业微信的接口。需要注意的是,所有的接口需使用Https协议、Js…...

2501d,jingo优化

原文 大家好,我重构和优化了一下jin.go这里: 我去掉了vibe.d依赖,因为它又慢又大,而且我无法与2版本交朋友.当仅运行1000个vibe纤程时,不仅应用崩溃,甚至图形系统驱动也崩溃一次,这需要重启笔记本电脑. 当前,我用小栈大小的本地流(4kb)解决. 我真很期待photon的稳定性,以恢复支…...

实景三维点云处理专业软件ArcGIS根据DSM生成地表点云集

常见的实景三维处理软件及其特色功能如下: 一、专业实景三维建模软件 Agisoft Metashape 高精度建模:能够生成高精度的三维模型,精度可以达到厘米级甚至毫米级,适用于需要详细测量和分析的项目,如文物保护和建筑测量。…...

山东大学人工智能导论期末复习概念汇总

人工智能概念汇总V2 —Nevertheless 简介 [!NOTE] 本文是在原版的基础上,面向期末而进行的删减版本 建议使用pdf版本,排版和图片显示完全。如有需要,可私信发送邮箱地址 PDF版本: 山东大学人工智能导论概念汇总pdf版 山东大学软…...

Ubuntu下安装Android Sdk

下载android sdk命令行工具 https://developer.android.com/studio?hlzh-cn#command-tools mkdir android-sdk cd android-sdk unzip commandlinetools-linux-11076708_latest.zip 添加环境变量到~/.bashrc export ANDROID_HOME$HOME/android-sdk export PATH$PATH:$ANDRO…...

c语言中GHashTable的使用

前言:最近在c代码中需要用到键值对的存储,由于没有map,需要自己实现或者使用库函数,g_hash_table_new是GLib中的库函数,但使用起来会有很多坑,记录一下 构建hash表g_hash_table_new GHashTable* g_hash_table_new(GH…...

Conda清理缓存

参考:1、2...

【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置

1、HarmonyOS 无法导入cardEmulation? 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability;在src/main/syscap.json(此文件需要手动创建)中添加如下内容 {"devices": {"gen…...

【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写

文章目录 一、随机数1、Random.Next()生成随机整数示例:生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例:生成随机浮点数 3、 生成随机字母或字符示例:生成随机字母示例:生成随机小写字母 二、…...

深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)

深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时,例如执行命令: conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包,保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...

《Vue3实战教程》35:Vue3测试

如果您有疑问,请观看视频教程《Vue3实战教程》 测试​ 为什么需要测试​ 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…...

Mysql监视器搭建

Mysql监视器搭建 资源下载在:Mysql监视器资源包 查询问题:CPU、连接数、慢查询 --> 暴增 1、exporter进行Mysql信息采集 修改my.cnf [client] userroot password数据库密码 host:数据库URL port3306启动命令 mysqld_exporter.exe --config.my-c…...

Linux(centos)安装 MySQL 8 数据库(图文详细教程)

前言 前几天写了个window系统下安装Mysql的博客,收到很多小伙伴私信需要Linux下安装Mysql的教程,今天这边和大家分享一下,话不多说,看教程。 一、删除以前安装的MySQL服务 一般安装程序第一步都需要清除之前的安装痕迹&#xff…...

软件工程大作业——图书管理系统/图书个性化推荐与实现系统

目录 1 绪论 1.1研究背景 1.2研究现状 1.3研究内容 2 系统关键技术 2.1 Spring Boot框架 2.2 JAVA技术 2.3 MYSQL数据库 2.4 B/S结构 3 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2经济可行性 3.1.3操作可行性 3.2 系统性能分析 3.3 系统功能分析 3.4系统流程分析 3.4.1登…...

Linux下编译安装PETSc

本文记录在Linux下编译安装PETSc的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 安装oneAPI 参见:Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 1.2 安…...

检索增强生成

概述 检索增强生成(Retrieval-Augmented Generation,RAG)是一种将信息检索与语言模型相结合的技术。由Facebook AI Research于2020年提出,它把数据库的优势与语言模型的优势相结合。它能让模型从外部知识库中检索信息&#xff0c…...

九、Vue 事件处理器

文章目录 前言一、基础事件绑定:v-on 指令二、方法调用:组织有序的交互逻辑三、事件修饰符阻止冒泡与默认事件捕获与自身触发单次触发与鼠标按键区分四、按键修饰符前言 在 Vue.js 的交互世界里,事件处理器起着举足轻重的作用,它让页面从静态展示迈向动态交互,精准捕捉用户…...

stm32内部flash在线读写操作

stm32内部flash在线读写操作 📍相关开源库文章介绍《STM32 利用FlashDB库实现在线扇区数据管理不丢失》 ✨不同系列,内部flash编程有所区别。例如stm32f1是按照页擦除,半字(16bit)或全字(32bit)数据写入;st…...

DuckDB:密钥管理器及其应用

密钥管理器(Secrets Manager)为所有使用密钥的后端提供了统一的用户界面。密钥信息可以被限定范围,因此不同的存储前缀可以有不同的密钥信息,例如允许在单个查询中连接跨组织的数据。密钥也可以持久化,这样就不需要在每次启动DuckDB时都指定它…...

每日一学——自动化工具(Ansible)

3.1 Ansible 3.1.1 Playbook编写指南 嘿,小伙伴们!你们知道吗,运维工作其实也可以变得像搭积木一样简单!今天我们要介绍的就是Ansible,一款非常流行的自动化运维工具。通过Ansible,我们可以用Playbook来描…...

typescripts语法笔记

游戏引擎:图形渲染系统,特效系统,物理系统,各个功能集合。 cocoscreator是将cocos2d-x封装成了可视化编辑。面向对象转变成面向组件开发。 ts编程是js编程语言的超集。 基础类型""可以转换成字符串类型,适用…...

TypyScript从入门到精通

TypyScript从入门到精通 TypyScript 是什么?增加了什么环境搭建二、为何需要 TypeScript三、编译 TypeScript四、类型声明五、类型推断基本类型六、类型总览JavaScript 中的数据类型TypeScript 中的数据类型1. 上述所有 JavaScript 类型2. 六个新类型:3.…...

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件,它主要用于在开发过程中提供智能的代码延续功能。例如,当你在编写代码并且需要进行下一步操作或者完成一个代码块时,它能够根据代码的上下文、语法规则以及相关的库和框架知识,为你提供可能的代码续…...

STM32-笔记20-测量按键按下时间

1、按键按下的时间-思路 我们先检测下降沿信号,检测到以后,在回调函数里切换成检测上升沿信号,当两个信号都检测到的时候,这段时间就是按键按下的时间,如图所示:>N*(ARR1)CCRx的值 N是在这段时间内&…...

继承与多态 - 继承机制、虚函数、纯虚函数

引言 C 是一种支持面向对象编程(OOP)的编程语言,继承和多态是 OOP 的两个核心概念。通过继承,我们可以创建新的类,这些新类可以重用现有类的代码,并且可以根据需要进行扩展或修改。多态则允许我们编写更加…...

微信小程序:正确输出<小于,大于>符号

错误写法 1、如果直接输入<符号会直接报错&#xff0c;>能正常使用&#xff0c;如图标红的是错误写法 2、输入html的<&gt的写法&#xff0c;会原样输入符号 解决方法 采用变量的方式输出 1、js写入变量 2、wxml直接写...

uni-app tab 双击事件监听

1、data中定义属性&#xff0c;用于临时记录点击次数 tabClick: {touchNum: 0 },2、添加页面事件监听方法 onTabItemTap(e) {this.tabClick.touchNumsetTimeout(()>{if(this.tabClick.touchNum > 2){// 双击执行代码区}this.tabClick.touchNum 0}, 250) },个人博客&am…...

GIT 企业级开发学习 1_基本操作

本节主要命令&#xff1a; git init ls 不能列出 .git ls -a 列出 .git 创建本地仓库 1. 初始化 Git 仓库 git init • 初始化一个新的 Git 仓库&#xff0c;在当前目录下生成一个 .git 隐藏文件夹&#xff0c;用于存储版本控制信息。 2. 查看隐藏文件 ls -a • 使用 ls …...

Computed在Vue2、Vue3写法的不同

在 Vue 2 和 Vue 3 中&#xff0c;computed 的写法有一些区别&#xff0c;特别是在 Vue 3 中新增了组合式 API 和 setup 语法糖。以下是不同写法的详细比较&#xff1a; 1. Vue 2 选项式 API 写法 在 Vue 2 中&#xff0c;computed 是一个选项&#xff0c;直接在 computed 对…...

Hive集群安装部署

上传安装包并解压 cd /ddhome/tools tar -zxvf apache-hive-3.1.2-bin.tar.gz -C /ddhome/bin/ cd /ddhome/bin/ mv apache-hive-3.1.2-bin hive注意&#xff1a;如果Hive要使用Spark计算引擎&#xff0c;需要重新编译Hive&#xff0c; 这里已经编译完毕 修改配置文件 cd …...

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…...

Gitea代码仓服务搭建

特点与优势 轻量级:Gitea是一个轻量级的Git服务,提供了快速、稳定的代码托管和协作开发环境。它资源占用低,适合在资源受限的环境中运行。易于安装和部署:Gitea提供了简单易用的安装和部署方式,支持多种安装方式,包括二进制文件、Docker容器等,并提供了详细的文档和配置…...

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java Virtual Machine&#xff0c;Java虚…...

docker 安装influxdb

docker pull influxdb mkdir -p /root/influxdb/data docker run -d --name influxdb -p 8086:8086 -v /root/influxdb/data:/var/lib/influxdb influxdb:latest#浏览器登录&#xff1a;http://192.168.31.135:8086&#xff0c;首次登录设置用户名密码&#xff1a;admin/admin1…...

TLS: WebRTC中ThreadManager的线程局部存储

1. 什么是线程局部存储&#xff1a; 线程局部存储&#xff08;TLS&#xff0c;Thread-Local Storage&#xff09;&#xff1a; 线程局部存储&#xff08;TLS&#xff09;允许每个线程保存一份独立的数据副本&#xff0c;避免多个线程共享数据导致的竞争问题。 每个线程可以根…...

[Qt] 万字详解 | 常用控件 | Button | Label | LCD | ProgressBar

目录 按钮类控件 1、Push Button 按钮 2、Radio Buttion 单选 click、press、release、toggled 的区别 3、Check Box 复选 4、Tool Button 显示类控件 1、Label 2、LCD Number 3、ProgressBar 4、Calendar Widget 按钮类控件 1、Push Button 按钮 概述&#xff1a…...

【数据仓库】hadoop3.3.6 安装配置

文章目录 概述下载解压安装伪分布式模式配置hdfs配置hadoop-env.shssh免密登录模式设置初始化HDFS启动hdfs配置yarn启动yarn 概述 该文档是基于hadoop3.2.2版本升级到hadoop3.3.6版本&#xff0c;所以有些配置&#xff0c;是可以不用做的&#xff0c;下面仅记录新增操作&#…...

ffmpeg八大开发库

‌FFmpeg八大库‌是指FFmpeg项目中最重要的八个库&#xff0c;它们各自承担不同的功能&#xff0c;共同构成了FFmpeg的强大功能。以下是这八大库的详细介绍&#xff1a; ‌libavcodec‌&#xff1a;负责音频和视频的编解码。它支持多种编解码器&#xff0c;如H.264、AAC、MP3、…...

Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能

Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中&#xff0c;生成图片是一个常见需求&#xff0c;例如用于分享海报、生成动态二维码等。在Uniapp框架中&#xff0c;我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…...

【09】深入解析 Three.js 官网示例:下雪粒子特效与场景渲染的实现(webgpu_compute_particles_snow.html)

引言 Three.js 是一个强大的 JavaScript 库&#xff0c;用于在网页上创建和渲染 3D 场景。本文将深入分析一段 Three.js 官网示例代码&#xff0c;详细解释其实现思路和主要功能代码&#xff0c;帮助读者更好地理解和掌握 Three.js 的应用。官网代码地址&#xff1a;https://g…...

电子价签会是零售界的下一个主流?【新立电子】

电子价签&#xff0c;作为一种能够替代传统纸质标签的数字显示屏&#xff0c;已经在零售行业中展现出其巨大的潜力。它具有实时更新、集中管理、高效节能的特点&#xff0c;实现价格的实时更新&#xff0c;大大减少更新价格的工作量和时间。为消费者带来更加便捷、准确的购物体…...

uniapp——App下载文件,保存、打开文件(二)

uniapp如何下载文件、保存、打开文件 时光荏苒&#xff0c;2024即将过去&#xff01; 迈向2025&#xff0c;祝大家新的一年工作顺利、万事如意&#xff0c;少一点BUG&#xff0c;涨一点工资…↖(ω)↗ 文章目录 uniapp如何下载文件、保存、打开文件下载文件保存并打开文件处理 …...

如何轻松关闭 iPhone 上的 HEIC [HEIC 图像技巧]

您是否正在为关闭 iPhone 上的 HEIC 而烦恼&#xff1f;你不是一个人; Apple 的首选图像文件格式仍可能存在一些兼容性问题。当您与某人共享照片或尝试在Windows计算机上打开图像时&#xff0c;就会出现此问题。幸运的是&#xff0c;Apple 使关闭 HEIC iPhone 变得更加容易。 …...

库伦值自动化功耗测试工具

1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流&#xff0c;并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理&#xff1a;基于文件节点 coulomb_count 实现&#xff0c;计算公式&#xff1a;电流&…...

[paddle] 非线性拟合问题的训练

利用paddlepaddle建立神经网络&#xff0c;模拟有限个数据的非线性拟合 本文仍然考虑 f ( x ) sin ⁡ ( x ) x f(x)\frac{\sin(x)}{x} f(x)xsin(x)​ 函数在区间 [-10,10] 上固定数据的拟合。 import paddle import paddle.nn as nn import numpy as np import matplotlib.…...

Vue2: table加载树形数据的踩坑记录

table中需要加载树形数据,如图: 官网给了两个例子,且每个例子中的tree-props都是这么写的: :tree-props="{children: children, hasChildren: hasChildren}" 给我一种错觉,以为数据结构中要同时指定children和hasChildren字段,然而,在非懒加载模式下,数据结…...

全国计算机设计大赛大数据主题赛(和鲸赛道)经验分享

全国计算机设计大赛大数据主题赛&#xff08;和鲸赛道&#xff09;经验分享 这是“和鲸杯”辽宁省普通高等学校本科大学生计算机设计竞赛启动会汇报—大数据主题赛的文档总结。想要参加2025年此比赛的可以借鉴。 一、关于我 人工智能专业 计赛相关奖项&#xff1a; 2022年计…...

C# 设计模式(行为型模式):责任链模式

C# 设计模式&#xff08;行为型模式&#xff09;&#xff1a;责任链模式 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;用于让多个对象有机会处理同一个请求&#xff0c;避免请求发送者与接收者之间的耦合。它通过将请…...