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

(十六)Java String类全面解析

一、String类概述

1.1 String的本质

在Java中,String类可能是使用最频繁的类之一,但它也是最容易被误解的类之一。从本质上讲,String代表的是一个不可变的Unicode字符序列。这种不可变性(immutability)是String类设计的核心特性。

java

String str = "Hello";
str = str + " World";  // 实际上是创建了一个新的String对象

当我们在Java中创建一个String对象时,它会被存储在Java内存的特定区域——字符串常量池(String Pool)中。这种设计带来了性能和内存使用的优化。

1.2 String在内存中的存储

理解String在内存中的存储方式对于编写高效Java程序至关重要:

  1. 字符串常量池:位于方法区(Method Area)的一部分,用于存储字符串字面量

  2. 堆内存:通过new关键字创建的String对象存储在堆中

  3. intern机制:可以手动将字符串放入常量池

java

String s1 = "Java";  // 存储在字符串常量池
String s2 = new String("Java");  // 存储在堆内存
String s3 = s2.intern();  // 返回常量池中的引用

1.3 String的不可变性

String的不可变性体现在以下几个方面:

  1. 类设计:String类被声明为final,防止被继承和修改

  2. 内部存储:内部使用final char[](JDK9后改为byte[])存储数据

  3. 方法行为:所有看似修改字符串的方法都返回新对象

不可变性的优点:

  • 线程安全

  • 可以缓存hash值

  • 便于实现字符串池

  • 安全性考虑(如网络连接、文件路径等)

二、String的创建方式

2.1 字面量创建

最直接的方式是使用双引号创建字符串字面量:

java

String str1 = "Java";
String str2 = "Java";  // 重用常量池中的相同对象
System.out.println(str1 == str2);  // true,引用相同对象

2.2 new关键字创建

使用构造器创建String对象会在堆中创建新实例:

java

String str3 = new String("Java");
String str4 = new String("Java");
System.out.println(str3 == str4);  // false,不同对象

2.3 字符数组创建

可以从字符数组创建String对象:

java

char[] charArray = {'J', 'a', 'v', 'a'};
String str5 = new String(charArray);

2.4 字节数组创建

处理字节流时常用此方式,可以指定字符编码:

java

byte[] byteArray = {74, 97, 118, 97};
String str6 = new String(byteArray, StandardCharsets.UTF_8);

2.5 StringBuffer/StringBuilder创建

从可变字符串类构建:

java

StringBuffer buffer = new StringBuffer("Java");
StringBuilder builder = new StringBuilder("Java");
String str7 = new String(buffer);
String str8 = new String(builder);

三、String常用API详解

3.1 字符串基本信息

3.1.1 length() - 获取长度

返回字符串的Unicode字符数:

java

String str = "Java编程";
System.out.println(str.length());  // 

注意与数组的length属性区分,数组是属性,字符串是方法。

3.1.2 isEmpty() - 判断空串

检查字符串是否为空(长度为0):

java

"".isEmpty();      // true
" ".isEmpty();     // false
null.isEmpty();    // NullPointerException
3.1.3 isBlank() - JDK11新增

检查字符串是否为空或仅包含空白字符:

java

"".isBlank();      // true
" ".isBlank();     // true
"\t\n".isBlank();  // true

3.2 字符串比较

3.2.1 equals() - 内容相等

比较字符串内容是否相同:

java

String s1 = "Java";
String s2 = new String("Java");
s1.equals(s2);  // true
3.2.2 equalsIgnoreCase() - 忽略大小写

不区分大小写的比较:

java

"Java".equalsIgnoreCase("JAVA");  // true
3.2.3 compareTo() - 字典序比较

按Unicode值比较字符串,返回差值:

java

"apple".compareTo("banana");  // 负值(a<b)
"zoo".compareTo("apple");     // 正值(z>a)
"java".compareTo("java");     // 0
3.2.4 contentEquals() - 与CharSequence比较

比较与任何CharSequence(如StringBuilder)的内容:

java

String str = "Java";
StringBuilder sb = new StringBuilder("Java");
str.contentEquals(sb);  // true

3.3 字符串查找

3.3.1 indexOf() - 查找字符/子串

返回第一次出现的索引:

java

"Java".indexOf('a');       // 1
"Java".indexOf("va");      // 2
"Java".indexOf('a', 2);    // 从索引2开始找,返回3
3.3.2 lastIndexOf() - 反向查找

返回最后一次出现的索引:

java

"Java".lastIndexOf('a');    // 3
"Java".lastIndexOf("va");   // 2
3.3.3 contains() - 包含检查

检查是否包含指定字符序列:

java

"Java".contains("av");  // true
3.3.4 startsWith()/endsWith() - 前缀/后缀检查

java

"Java".startsWith("Ja");   // true
"Java".endsWith("va");     // true
3.3.5 matches() - 正则匹配

使用正则表达式匹配整个字符串:

java

"Java8".matches("Java\\d");  // true

3.4 字符串操作

3.4.1 substring() - 子串提取

提取子字符串:

java

"Hello World".substring(6);     // "World"
"Hello World".substring(0, 5);  // "Hello"

注意:JDK7u6之前substring共享原char数组可能导致内存泄漏。

3.4.2 concat() - 字符串连接

连接字符串(不如+或StringBuilder常用):

java

"Hello".concat(" World");  // "Hello World"
3.4.3 replace() - 字符/子串替换

替换字符或子串:

java

"Java".replace('a', 'o');     // "Jovo"
"Java".replace("va", "vaEE"); // "JavaEE"
3.4.4 replaceAll()/replaceFirst() - 正则替换

使用正则表达式替换:

java

"a1b2c3".replaceAll("\\d", "-");  // "a-b-c-"
"a1b2c3".replaceFirst("\\d", "-"); // "a-b2c3"
3.4.5 split() - 字符串分割

按正则表达式分割字符串:

java

"a,b,c".split(",");        // ["a", "b", "c"]
"a..b.c".split("\\.+");    // ["a", "b", "c"]
3.4.6 join() - 字符串拼接

JDK8新增,用分隔符连接字符串:

java

String.join("-", "Java", "is", "cool"); // "Java-is-cool"
3.4.7 repeat() - JDK11新增

重复字符串指定次数:

java

"Java".repeat(3);  // "JavaJavaJava"
3.4.8 toLowerCase()/toUpperCase() - 大小写转换

java

"Java".toLowerCase();  // "java"
"Java".toUpperCase();  // "JAVA"

注意:在土耳其等地区可能需要指定Locale。

3.5 字符串转换

3.5.1 toCharArray() - 转为字符数组

java

char[] chars = "Java".toCharArray();
3.5.2 getBytes() - 转为字节数组

可以指定字符编码:

java

byte[] bytes1 = "Java".getBytes();
byte[] bytes2 = "Java".getBytes(StandardCharsets.UTF_8);
3.5.3 valueOf() - 其他类型转String

静态方法,将各种类型转为String:

java

String.valueOf(123);     // "123"
String.valueOf(true);    // "true"
String.valueOf(3.14);    // "3.14"
String.valueOf(new Object()); // 调用toString()
3.5.4 format() - 格式化字符串

类似C的printf:

java

String.format("Hi, %s! You have %d messages.", "Alice", 5);

3.6 字符串空白处理

3.6.1 trim() - 去除两端空白

去除ASCII空白字符(<=U+0020):

java

"  Java  ".trim();  // "Java"
3.6.2 strip() - JDK11新增

去除Unicode空白字符:

java

"\u2000Java\u2000".strip();  // "Java"
3.6.3 stripLeading()/stripTrailing() - JDK11新增

仅去除前导或尾部空白:

java

"  Java  ".stripLeading();   // "Java  "
"  Java  ".stripTrailing();  // "  Java"

3.7 其他实用方法

3.7.1 intern() - 字符串池化

将字符串放入常量池或返回已有引用:

java

String s1 = new String("Java").intern();
String s2 = "Java";
s1 == s2;  // true
3.7.2 chars() - JDK8流式处理

返回IntStream,可用于函数式处理:

java

"Java".chars().forEach(System.out::println);
3.7.3 codePoints() - 处理Unicode代码点

正确处理补充字符(如emoji):

java

"😊Java".codePoints().forEach(System.out::println);
3.7.4 lines() - JDK11按行分割

按行终止符分割字符串:

java

"Line1\nLine2\rLine3".lines().forEach(System.out::println);

四、String性能优化

4.1 字符串拼接的陷阱

字符串拼接是性能问题的常见来源:

java

// 低效写法 - 产生多个中间String对象
String result = "";
for (int i = 0; i < 100; i++) {result += i;
}// 高效写法 - 使用StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {sb.append(i);
}
String result = sb.toString();

4.2 字符串常量池的利用

合理利用字符串常量池可以减少内存使用:

java

// 推荐 - 使用字面量
String s1 = "Java";// 不推荐 - 除非必要,避免new String
String s2 = new String("Java");// 大量重复字符串可考虑intern()
String s3 = new String(charArray).intern();

4.3 大字符串处理

处理大文本时:

  1. 考虑使用StringReaderStringWriter

  2. 避免在内存中保存整个大字符串

  3. 使用substring时注意老版本的内存泄漏问题

4.4 正则表达式优化

复杂正则可能成为性能瓶颈:

java

// 预编译正则表达式
Pattern pattern = Pattern.compile("your_regex");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {// 处理匹配
}

五、String相关类比较

5.1 String vs StringBuffer vs StringBuilder

特性StringStringBufferStringBuilder
可变性不可变可变可变
线程安全是(因为不可变)是(同步方法)
性能-比StringBuilder慢最快
使用场景常量字符串多线程环境字符串操作单线程环境字符串操作

5.2 CharSequence接口

String、StringBuilder、StringBuffer都实现了CharSequence接口,定义了对字符序列的基本操作。当只需要读取字符序列时,使用CharSequence作为参数类型更通用。

六、Java版本演进中的String变化

6.1 JDK6及之前

  1. 字符串常量池位于方法区(永久代)

  2. substring共享原char数组

6.2 JDK7

  1. 字符串常量池移到堆内存

  2. substring不再共享数组,解决潜在内存泄漏

6.3 JDK8

  1. 引入String.join()方法

  2. 新增chars()和codePoints()方法

6.4 JDK9

  1. String内部存储改为byte[]+编码标记字段

  2. 紧凑字符串(Compact Strings)优化,Latin-1字符使用单字节存储

6.5 JDK11

  1. 新增isBlank()、lines()、repeat()等方法

  2. 新增strip()系列方法处理Unicode空白

七、String在实际开发中的应用

7.1 字符串缓存

利用String不可变性实现缓存:

java

public class StringCache {private static final Map<String, String> CACHE = new HashMap<>();public static String getCachedString(String input) {return CACHE.computeIfAbsent(input, String::new);}
}

7.2 字符串作为Map的Key

String是理想的Map键类型:

  1. 不可变性保证哈希值不变

  2. 实现了正确的equals和hashCode

  3. 有高效的比较性能

java

Map<String, Integer> wordCount = new HashMap<>();
wordCount.put("Java", wordCount.getOrDefault("Java", 0) + 1);

7.3 字符串与I/O操作

文件读写时的字符串处理:

java

// 读取文件内容为字符串
String content = new String(Files.readAllBytes(path), StandardCharsets.UTF_8);// 写入字符串到文件
Files.write(path, content.getBytes(StandardCharsets.UTF_8));

7.4 字符串与网络通信

网络协议处理中的字符串应用:

java

// HTTP请求处理
String requestLine = "GET /index.html HTTP/1.1";
String[] parts = requestLine.split(" ");
String method = parts[0];
String path = parts[1];
String protocol = parts[2];

八、常见面试问题解析

8.1 String为什么设计为不可变?

  1. 安全性:防止意外修改,如网络连接、文件路径等

  2. 线程安全:无需同步即可在多线程中使用

  3. 缓存哈希:作为HashMap键时哈希值只需计算一次

  4. 字符串池:实现字符串常量池优化

  5. 类加载机制:类名等字符串需要稳定性

8.2 String、StringBuffer和StringBuilder的区别?

  1. 可变性:String不可变,后两者可变

  2. 线程安全:StringBuffer同步方法保证线程安全

  3. 性能:StringBuilder在单线程下性能最佳

  4. 使用场景:少量拼接用String,多线程用StringBuffer,单线程大量操作用StringBuilder

8.3 String的intern()方法有什么作用?

将字符串对象添加到字符串常量池(如果池中不存在),并返回池中引用。可以用于减少重复字符串的内存占用,但需谨慎使用,因为:

  1. 常量池大小有限

  2. 不当使用可能增加GC负担

  3. JDK7后常量池位于堆内存,不再受永久代大小限制

8.4 如何高效拼接多个字符串?

  1. 少量拼接:直接使用+(编译器会优化为StringBuilder)

  2. 循环内拼接:显式使用StringBuilder

  3. JDK8+:使用String.join()或StringJoiner

  4. 大量数据:考虑使用字符流或直接操作char数组

8.5 String的hashCode()如何计算?

String的哈希计算采用多项式哈希:

java

// JDK中的实现
public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;
}

选择31的原因:

  • 奇质数,减少哈希冲突

  • 31 * i可以被优化为(i << 5) - i

  • 经验证明对英文字符分布效果良好

九、String的最佳实践

9.1 编码规范建议

  1. 字符串比较总是使用equals()而非==

  2. 优先使用字符串字面量而非new String()

  3. 拼接路径使用Path类而非字符串拼接

  4. 处理用户输入时显式指定字符编码

  5. 敏感信息(如密码)避免用String,使用char[]

9.2 性能优化建议

  1. 避免在循环中使用+拼接字符串

  2. 预编译频繁使用的正则表达式

  3. 考虑重用StringBuilder实例(需权衡线程安全)

  4. 大文本处理使用流式API

  5. 合理使用intern()但不要过度

9.3 安全性建议

  1. SQL查询使用PreparedStatement而非字符串拼接

  2. 处理HTML/XML时使用专用转义工具

  3. 日志输出前过滤敏感信息

  4. 比较敏感字符串(如密码)使用Arrays.equals(char[], char[])

  5. 注意Unicode欺骗攻击(如视觉相似字符)

十、String的未来发展

10.1 Valhalla项目的影响

Java Valhalla项目(值类型和内联类)可能带来的改变:

  1. 可能引入更高效不可变字符串实现

  2. 减少对象头开销

  3. 更好的内存局部性

10.2 字符串压缩技术

未来可能进一步优化字符串存储:

  1. 更智能的编码检测和转换

  2. 对特定领域(如DNA序列)的特殊优化

  3. 与硬件特性(如SIMD)结合的加速处理

10.3 多语言增强

改进对多语言文本的处理:

  1. 更好的emoji支持

  2. 更完善的正则表达式Unicode属性支持

  3. 更高效的国际化字符串处理

结语

String作为Java中最基础也最复杂的类之一,其设计理念和实现细节体现了Java语言的许多核心思想。深入理解String类不仅有助于编写高效、安全的Java代码,也是理解Java内存模型、不可变对象设计等高级主题的良好起点。随着Java语言的不断发展,String类也在持续优化和改进,但它的核心概念——不可变的Unicode字符序列——将始终保持不变。

相关文章:

(十六)Java String类全面解析

一、String类概述 1.1 String的本质 在Java中&#xff0c;String类可能是使用最频繁的类之一&#xff0c;但它也是最容易被误解的类之一。从本质上讲&#xff0c;String代表的是一个不可变的Unicode字符序列。这种不可变性(immutability)是String类设计的核心特性。 java S…...

Android架构之自定义native进程

在Android五层架构中&#xff0c;native层基本上全是c的世界&#xff0c;这些c进程基本上靠android世界的第一个进程init进程创建&#xff0c;init通过rc配置文件&#xff0c;创建了众多的c子进程&#xff0c;也是这众多的c进程&#xff0c;构建了整个android世界的native层。 …...

#跟着若城学鸿蒙# HarmonyOS NEXT学习之AlphabetIndexer组件详解

一、组件介绍 AlphabetIndexer&#xff08;字母索引条&#xff09;是HarmonyOS NEXT中一个非常实用的UI组件&#xff0c;它主要用于在列表视图中提供快速的字母导航功能。当应用中有大量按字母顺序排列的数据&#xff08;如联系人列表、城市列表等&#xff09;时&#xff0c;A…...

React百日学习计划——Deepseek版

阶段一&#xff1a;基础巩固&#xff08;1-20天&#xff09; 目标&#xff1a;掌握HTML/CSS/JavaScript核心语法和开发环境搭建。 每日学习内容&#xff1a; HTML/CSS&#xff08;1-10天&#xff09; 标签语义化、盒模型、Flex布局、Grid布局、响应式设计&#xff08;媒体查询…...

Room持久化库:从零到一的全面解析与实战

简介 在Android开发中,Room作为官方推荐的数据库持久化库,提供了对SQLite的抽象层,使得数据库操作更加安全、高效且易于维护。 Room通过注解处理器和编译时验证,显著降低了数据库操作的复杂度,同时支持响应式编程模式,使开发者能够轻松实现数据变化的实时监听。对于企业…...

Linux云计算训练营笔记day07(MySQL数据库)

数据库 DataBase 保存数据的仓库 数据库管理系统 DBMS 这是一个可以独立运行&#xff0c;用于维护磁盘上的数据的一套软件 特点: 维护性高&#xff0c;灵活度高&#xff0c;效率高&#xff0c;可扩展性强 常见的DBMS Mysql Mariadb Oracle DB2 SQLServer MySQL是一个关系型…...

C语言之旅5---分支与循环【2】

&#x1f4ab;只有认知的突破&#x1f4ab;才来带来真正的成长&#x1f4ab;编程技术的学习&#x1f4ab;没有捷径&#x1f4ab;一起加油&#x1f4ab; &#x1f341;感谢各位的观看&#x1f341;欢迎大家留言&#x1f341;咱们一起加油&#x1f341;努力成为更好的自己&#x…...

K230 ISP:一种新的白平衡标定方法

第一次遇见需要利用光谱响应曲线进行白平衡标定的方法。很好奇是如何利用光谱响应曲线进行白平衡标定的。 参考资料参考&#xff1a;K230 ISP图像调优指南 K230 介绍 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核异构单元加速计算架构&a…...

【Web应用】Vue 项目前端项目文件夹和文件介绍

文章目录 ⭐前言⭐一、文件夹介绍&#x1f31f;1、.idea&#x1f31f;2、bin&#x1f31f;3、build&#x1f31f;4、node_modules&#x1f31f;5、public&#x1f31f;6、src ⭐二、文件介绍&#x1f31f;1、.editorconfig&#x1f31f;2、.env.development、.env.production、…...

Leetcode 3544. Subtree Inversion Sum

Leetcode 3544. Subtree Inversion Sum 1. 解题思路2. 代码实现 题目链接&#xff1a;3544. Subtree Inversion Sum 1. 解题思路 这一题我的思路上就是一个动态规划的思路&#xff0c;因为原则上我们只需要遍历一下所有的状态即可&#xff0c;但是这样显然时间复杂度过高&am…...

分别在windows和linux上使用curl,有啥区别?

作为开发者常用的网络工具&#xff0c;curl 在 Windows 和 Linux 上的使用看似相似&#xff0c;但实际存在不少细节差异。以下从 命令语法、环境特性、功能支持 和 开发体验 四个角度展开对比&#xff0c;帮助读者避免跨平台开发时的常见“坑”。 一、命令语法差异&#xff1a;…...

微服务八股(自用)

微服务 SpringCloud 注册中心&#xff1a;Eureka 负载均衡&#xff1a;Ribbon 远程调用&#xff1a;Feign 服务熔断&#xff1a;Hystrix 网关&#xff1a;Gateway/Zuul Alibaba 配置中心&#xff1a;Nacos 负载均衡&#xff1a;Ribbon 服务调用&#xff1a;Feign 服务…...

TCP首部格式及三次握手四次挥手

TCP协议详解&#xff1a;首部格式与连接管理 一、TCP首部格式 TCP首部最小20字节&#xff0c;最大60字节&#xff0c;包含以下字段&#xff1a; | 源端口号(16bit) | 目的端口号(16bit) | | 序列号(32bit) | | 确认号(32bit) | | 数据偏移(4bit)| 保留(6bit) |U|A|P|R|S|…...

Python查询ES错误ApiError(406, ‘Content-Type ...is not supported

现象 使用python查询es数据时出现下面错误 Traceback (most recent call last):File "getUsers.py", line 26, in <module>response es.search(index"lizz_users", bodyquery)File "/usr/local/lib/python3.6/site-packages/elasticsearch/_…...

下周,Coinbase将被纳入标普500指数

Coinbase加入标普500指数紧随比特币突破10万美元大关之后。加密资产正在日益成为美国金融体系的一部分。大型机构已获得监管批准创建现货比特币交易所交易基金&#xff0c;进一步推动了加密货币的主流化进程。 加密货币行业迎来里程碑时刻&#xff0c;Coinbase即将加入标普500…...

物理:由基本粒子组成的个体能否提炼和重组?

个体差异源于基本粒子组合的复杂性与随机性,这一假设若成立,确实可能为生物医学带来革命性突破——但需要突破技术、理论与系统层级的多重壁垒。以下从科学逻辑与技术路径展开分析: 一、随机组合中的共性与稳定结构 1. 自然界的自组织规律 涌现性(Emergence):尽管粒子组…...

Python Day 24 学习

讲义Day16内容的精进 NumPy数组 Q. 什么是NumPy数组&#xff1f; NumPy数组是Python中由NumPy库提供的一种多维数组对象&#xff0c;它称为N-dimensional array,简称ndarray。它是用于数值计算的核心数据结构&#xff0c;能够高效地存储和操作大量的同类型数据。 Q. NumPy数…...

ppy/osu构建

下载 .NET (Linux、macOS 和 Windows) | .NET dotnet还行 构建&#xff1a;f5 运行&#xff1a;dotnet run --project osu.Desktop -c Debug...

前端学习(2)—— CSS详解与使用

目录 一&#xff0c;CSS基础 1.1 语法规范 1.2 引入方式 1.3 选择器 1.3.1 基础选择器 1.3.2 复合选择器 1.3.3 选择器小结 二&#xff0c;CSS使用 2.1 字体设置 2.2 文本属性 2.3 背景属性 2.2 圆角矩形 三&#xff0c;关于浏览器 3.1 Chrome 调试工具 -- 查看 …...

邀请函|PostgreSQL培训认证报名正式开启

掌握PostgreSQL 轻松驾驭主流国产数据库 PostgreSQL培训认证 6月开课 报名火热进行中&#xff5e; 美创中国PostgreSQL培训认证合作机构 中国PostgreSQL培训认证由中国开源软件联盟PostgreSQL分会联合中国电子工业标准化技术协会共同打造&#xff0c;是国内权威的PG技术等级…...

力扣HOT100之二叉树:543. 二叉树的直径

这道题本来想到可以用递归做&#xff0c;但是还是没想明白&#xff0c;最后还是去看灵神题解了&#xff0c;感觉这道题最大的收获就是巩固了我对lambda表达式的掌握。 按照灵神的思路&#xff0c;直径可以理解为从一个叶子出发向上&#xff0c;在某个节点处拐弯&#xff0c;然后…...

深入理解 NumPy:Python 科学计算的基石

在数据科学、人工智能和科学计算的世界里&#xff0c;NumPy 是一块绕不过去的基石。它是 Python 语言中用于高性能科学计算的基础包&#xff0c;几乎所有的数据分析与机器学习框架&#xff08;如 Pandas、TensorFlow、Scikit-learn&#xff09;都离不开它的支持。 一、什么是 …...

基于STM32、HAL库的ADAU1701JSTZ-RL音频接口芯片驱动程序设计

一、简介: ADAU1701JSTZ-RL 是一款高性能音频编解码器 (Codec),专为便携式和低功耗应用设计。它集成了 ADC、DAC、麦克风前置放大器、耳机放大器和数字信号处理功能,支持 I2S/PCM 音频接口和 I2C 控制接口,非常适合与 STM32 微控制器配合使用。 二、硬件接口: 典型的 ST…...

SpringBoot--springboot简述及快速入门

spring Boot是spring提供的一个子项目&#xff0c;用于快速构建spring应用程序 传统方式&#xff1a; 在众多子项目中&#xff0c;spring framework项目为核心子项目&#xff0c;提供了核心的功能&#xff0c;其他的子项目都需要依赖于spring framework&#xff0c;在我们实际…...

智慧校园场景下iVX 研发基座应用实践与行业适配研究

一、智慧校园多系统协同实践 在智慧校园建设中&#xff0c;iVX 研发基座通过模块化协作开发模式实现跨系统集成与数据治理。以校园门户与子系统整合为例&#xff0c;基座通过统一身份认证体系实现单点登录&#xff08;SSO&#xff09;&#xff0c;用户中心基于 ABAC 模型动态控…...

故障诊断模型评估——混淆矩阵,如何使样本量一致(上)

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…...

Redis Cluster 集群搭建和集成使用的详细步骤示例

以下是Redis集群搭建和集成使用的详细步骤示例&#xff1a; 搭建Redis集群 环境准备 下载Redis&#xff1a;从Redis官方网站下载最新稳定版本的Redis源代码&#xff0c;解压到指定目录&#xff0c;如/opt/redis。安装依赖&#xff1a;确保系统安装了必要的依赖&#xff0c;如…...

【技巧】使用UV创建python项目的开发环境

回到目录 【技巧】使用UV创建python项目的开发环境 0. 为什么用UV 下载速度快、虚拟环境、多版本python支持、清晰的依赖关系 1. 安装基础软件 1.1. 安装python 下载地址&#xff1a;https://www.python.org/downloads/windows/ 1.2. 安装UV > pip install uv -i ht…...

竞业禁止协议中AI技能限制的深度剖析

首席数据官高鹏律师团队 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;领域成为了商业竞争的关键战场。随着AI技术在各行业的广泛渗透&#xff0c;竞业禁止协议中涉及AI技能的限制条款愈发受到关注&#xff0c;其背后蕴含着复杂而关键的法律与商业…...

Mirror的多人连接管理及房间系统

以下是一个基于Mirror的多人连接管理及房间系统的服务端实现方案&#xff0c;包含部署说明&#xff1a; 一、服务端架构设计 网络管理扩展 using Mirror; using UnityEngine;public class RoomNetworkManager : NetworkManager {// 房间字典&#xff08;房间ID -> 房间对象…...

基于Session实现短信登录全流程详解

前言 在当今的Web应用中&#xff0c;短信验证码登录已成为最常用的身份验证方式之一。本文将详细介绍基于Session实现短信登录的全套流程&#xff0c;包括技术选型、流程设计、具体实现以及安全防护措施。通过本文&#xff0c;您将掌握从发送验证码到完成登录的完整实现方案。…...

关于 javax.validation.constraints的详细说明

以下是关于 javax.validation.constraints&#xff08;现为 ​Jakarta Bean Validation&#xff09;的详细说明&#xff0c;涵盖核心注解、使用场景、代码示例及最佳实践&#xff1a; 一、javax.validation.constraints 是什么&#xff1f; ​作用​&#xff1a;提供一组标准注…...

linux系统如何将采集的串口数据存储到txt

步骤&#xff1a; 确认串口设备&#xff1a;通常为/dev/ttyS0&#xff08;COM1&#xff09;或/dev/ttyUSB0&#xff08;USB转串口&#xff09;。设置波特率等参数&#xff1a;使用stty命令&#xff0c;例如&#xff1a; bash stty -F /dev/ttyUSB0 9600 cs8 -icanon -ixon 实时…...

(顺序表、单链表、双链表)==>一篇解决!(Java版)

文章目录 一、线性表二、顺序表三、单链表四、双链表 一、线性表 线性表是最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。 线性表的特征&#xff1a;数据元素之间具有一种“一对一”的逻辑关系。 线性表的分类&#xff1a; 线…...

大模型常用位置编码方式

深度学习中常见的位置编码方式及其Python实现&#xff1a; 一、固定位置编码&#xff08;Sinusoidal Positional Encoding&#xff09; 原理 通过不同频率的正弦和余弦函数生成位置编码&#xff0c;使模型能够捕捉绝对位置和相对位置信息。公式为&#xff1a; 公式标准数学表达…...

【fastadmin开发实战】在前端页面中使用bootstraptable以及表格中实现文件上传

先看效果&#xff1a; 1、前端页面中引入了表格 2、表格中实现文件上传 3、增加截止时间页面 难点在哪呢&#xff1f; 1、这是前端页面&#xff0c;并不支持直接使用btn-dialog的类属性实现弹窗&#xff1b; 2、前端页面一般绑定了layout模板&#xff0c;如何实现某个页面不…...

IO、存储、硬盘、文件系统相关常识

目录 1. IO&#xff08;输入输出&#xff09;基础概念 1.1 IO的定义 1.2 流 1.3 IO流 2.存储 2.1 存储技术 2.2 存储介质的分类&#xff08;机械硬盘、固态硬盘、光盘、磁带&#xff09; 2.2.1 机械硬盘 2.2.2 固态硬盘 2.2.3 光盘 2.2.4 磁盘 2.3 存储管理 2.4 存…...

amd架构主机构建arm架构kkfileview

修改本机使用镜像仓库地址 vim /etc/docker/daemon.json { “experimental”: true, “registry-mirrors”: [ “https://docker.m.daocloud.io”, “https://docker.1panel.live”, “http://mirrors.ustc.edu.cn/”, “http://mirror.azure.cn/”, “https://docker.hpcloud.…...

日志链路ID配置,traceId多线程不打印什么鬼?

logback.xml 关键配置 [traceId:%X{traceId}] <!-- 彩色日志格式模板 --><property name"log.pattern.color"value"%green(%d{yyyy-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level){FATALred, ERRORred, WARNyellow, INFOgreen, DEBUGcyan, TRA…...

InfluxDB-数据看板实现流程:从数据采集到可视化展示

数据看板的实现涉及到多个步骤和技术组件&#xff0c;以下是基于提供的知识库内容&#xff0c;详细解释数据看板&#xff08;特别是30日活跃用户数趋势&#xff09;的实现过程&#xff1a; 1. 数据来源 所有用户行为数据通过网关进行数据埋点&#xff0c;并通过消息队列&…...

Git基本操作命令

文章目录 Git基本操作命令创建仓库命令提交与修改提交日志版本回退分支切换删除文件.gitignore文件远程操作 Git分支管理创建分支查看分支合并分支删除分支保存当前文件未提交更改并切换分支 Git提交历史恢复和回退 Git标签标签推送删除标签附注标签查看标签信息删除标签 Git基…...

JavaScript实践(三)JavaScript序列化与反序列化深度解析

JavaScript中的序列化与反序列化是数据存储、网络传输和跨系统交互的核心技术之一。本文将从底层原理、核心方法、复杂场景处理、安全风险及工程实践等多个维度&#xff0c;系统性地解析这一技术体系&#xff0c;并附完整的代码实现示例。 一、序列化与反序列化的核心价值 序列…...

大模型—— FastGPT 知识库无缝集成到 n8n 工作流 (基于 MCP 协议)

大模型—— FastGPT 知识库无缝集成到 n8n 工作流 (基于 MCP 协议) 背景:n8n 与 RAG 知识库集成的挑战 n8n 作为一款强大的开源自动化工作流工具,正获得越来越多用户的青睐。它由前《加勒比海盗》视觉设计师 Jan Oberhauser 于 2019 年创立,旨在提供比 Zapier 等工具更灵活…...

安卓刷机模式详解:Fastboot、Fastbootd、9008与MTK深刷

安卓刷机模式详解&#xff1a;Fastboot、Fastbootd、9008与MTK深刷 一、刷机模式对比 1. Fastboot模式 简介&#xff1a;传统安卓底层刷机模式&#xff0c;通过USB连接电脑操作优点&#xff1a;支持大多数安卓设备&#xff0c;操作相对简单缺点&#xff1a;需要设备进入特定…...

深入浅出MySQL 8.0:新特性与最佳实践

MySQL作为开源关系型数据库的佼佼者&#xff0c;近年来持续更新迭代&#xff0c;尤其是在8.0版本中引入了一系列令人兴奋的新特性。本文将介绍一些MySQL 8.0的关键新功能&#xff0c;并提供最佳实践&#xff0c;旨在帮助开发人员和DBA更好地利用这一强大的数据库管理系统。 一…...

【登录认证】JWT令牌

一、概述 JWT全称:**JSON Web Token **(https://jwt.io/)定义了一种简洁的、自包含的格式&#xff0c;用于通信双方以json数据格式安全的传输信息。组成: ①第一部分:Header(头)&#xff0c;记录令牌类型、签名算法等。例如: (“alg”:" HS256"," type":“…...

coco数据集mAP评估

0 coco数据集划分说明 1 用yolo自带的评估 from ultralytics import YOLOmodel YOLO("../spatial-perception/checkpoints/yolo11n.pt")metrics model.val(data"./coco.yaml", save_jsonTrue) ## save_json为True,可以把预测结果存成json文件&#xff…...

C++23 ranges::range_adaptor_closure:程序定义的范围适配器闭包的辅助类

文章目录 一、背景介绍二、ranges::range_adaptor_closure 的定义与要求三、使用示例四、编译器支持情况五、总结 一、背景介绍 C23 引入了 std::ranges::range_adaptor_closure&#xff0c;这是一个辅助类模板&#xff0c;用于定义用户自定义的范围适配器闭包对象。这一特性主…...

滑动窗口——水果成篮

根据题意我们转化一下&#xff0c;在数组中求一个最长的子数组&#xff0c;数组中的数字种类不超过2种。 借助暴力思想&#xff0c;我们定义双指针进行进窗口、判断、出窗口、更新结果的流程。 我们需要借助hash表来记录不同数字出现的种类以及每个数字出现的次数。然后先让r…...

论文精读:YOLO-UniOW: Efficient Universal Open-World Object Detection

文章目录 前言1、出发点2、方法2.1.符号说明2.2.Efficient Adaptive Decision Learning2.3.Open-World Wildcard Learning 3、实验结果总结 前言 本文介绍一篇来自Tencent的开放词汇和世界检测结合的论文&#xff1a;Yolo-uniow&#xff0c;开源地址。 1、出发点 本篇论文相当…...