Java从入门到“放弃”(精通)之旅——String类⑩
Java从入门到“放弃”(精通)之旅🚀——String类⑩
前言
在Java编程中,String类是最常用也是最重要的类之一。无论是日常开发还是面试,对String类的深入理解都是必不可少的。
1. String类的重要性
在C语言中,字符串只能使用字符数组或字符指针表示,操作字符串需要依赖标准库函数。这种方式将数据和操作分离,不符合面向对象思想。Java专门提供了String类来解决这个问题。
String类在开发中无处不在,例如:
- 字符串转数字
- 字符串拼接
- 数据校验等
面试中也经常被问到String相关的问题,如String、StringBuffer和StringBuilder的区别等。
2. 常用方法
2.1 字符串构造
String类提供了多种构造方式,常用的有三种:
public static void main(String[] args) {// 使用常量串构造String s1 = "hello bit";System.out.println(s1);// 直接new String对象String s2 = new String("hello bit");System.out.println(s2);// 使用字符数组进行构造char[] array = {'h','e','l','l','o',' ','b','i','t'};String s3 = new String(array);System.out.println(s3);
}
注意:String是引用类型,并不是直接保存字符串内容,而是内部通过字符数组存储字符串内容。
代码示例:
public static void main(String[] args) {// s1和s2引用的是不同对象 s1和s3引用的是同一对象String s1 = new String("hello");String s2 = new String("world");String s3 = s1;System.out.println(s1.length()); // 获取字符串长度---输出5System.out.println(s1.isEmpty()); // 如果字符串长度为0,返回true,否则返回false
}
2.2 String对象的比较
Java提供了4种字符串比较方式:
- ==比较引用地址
public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("world");String s4 = s1;System.out.println(s1 == s2); // falseSystem.out.println(s2 == s3); // falseSystem.out.println(s1 == s4); // true
}
- equals()方法:按字典序比较
public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hello");String s3 = new String("Hello");System.out.println(s1.equals(s2)); // trueSystem.out.println(s1.equals(s3)); // false
}
- compareTo()方法:按字典序比较并返回差值
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("abc");String s4 = new String("abcdef");System.out.println(s1.compareTo(s2)); // -1System.out.println(s1.compareTo(s3)); // 0System.out.println(s1.compareTo(s4)); // -3
}
- compareToIgnoreCase()方法:忽略大小写的compareTo
public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("ABC");String s4 = new String("abcdef");System.out.println(s1.compareToIgnoreCase(s2)); // -1System.out.println(s1.compareToIgnoreCase(s3)); // 0System.out.println(s1.compareToIgnoreCase(s4)); // -3
}
2.3 字符串查找
常用查找方法:
方法 | 功能 |
---|---|
char charAt(int index) | 返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException 异常 |
int indexOf(int ch) | 返回ch第一次出现的位置,没有返回-1 |
int indexOf(int ch, int fromIndex) | 从fromIndex位置开始找ch第一次出现的位置,没有返回-1 |
int indexOf(String str) | 返回str第一次出现的位置,没有返回-1 |
int indexOf(String str, int fromIndex) | 从fromIndex位置开始找str第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch) | 从后往前找,返回ch第一次出现的位置,没有返回-1 |
int lastIndexOf(int ch, int fromIndex) | 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1 |
int lastIndexOf(String str) | 从后往前找,返回str第一次出现的位置,没有返回-1 |
int lastIndexOf(String str, int fromIndex) | 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1 |
public static void main(String[] args) {String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(3)); // 'b'System.out.println(s.indexOf('c')); // 6System.out.println(s.lastIndexOf('c')); // 17
}
2.4 字符串转化
- 数值和字符串互转
public static void main(String[] args) {// 数字转字符串String s1 = String.valueOf(1234);String s2 = String.valueOf(12.34);// 字符串转数字int data1 = Integer.parseInt("1234");double data2 = Double.parseDouble("12.34");
}
- 大小写转换
public static void main(String[] args) {String s1 = "hello";String s2 = "HELLO";System.out.println(s1.toUpperCase()); // HELLOSystem.out.println(s2.toLowerCase()); // hello
}
- 字符串与数组互转
public static void main(String[] args) {String s = "hello";// 字符串转数组char[] ch = s.toCharArray();// 数组转字符串String s2 = new String(ch);
}
2.5 字符串替换
public static void main(String[] args) {String str = "helloworld";System.out.println(str.replaceAll("l", "_")); // he__owor_dSystem.out.println(str.replaceFirst("l", "_")); // he_loworld
}
注意:字符串是不可变对象,替换操作会创建新对象。
2.6 字符串拆分
public static void main(String[] args) {// 基本拆分String str = "hello world hello bit";String[] result = str.split(" ");// 部分拆分String[] result2 = str.split(" ", 2);// 拆分IP地址String ip = "192.168.1.1";String[] ipParts = ip.split("\\.");
}
2.7 字符串截取
public static void main(String[] args) {String str = "helloworld";System.out.println(str.substring(5)); // worldSystem.out.println(str.substring(0, 5)); // hello
}
2.8 其他操作方法
public static void main(String[] args) {// 去除首尾空格String str = " hello world ";System.out.println(str.trim());// 大小写转换String mixed = "Hello%$$%@#$%World";System.out.println(mixed.toUpperCase());System.out.println(mixed.toLowerCase());
}
3. 字符串的不可变性
String类被设计为不可变类,主要原因有:
- 方便实现字符串常量池
- 线程安全
- 便于缓存hash code
注意:String不可变不是因为final修饰,而是因为其设计如此。
public final class String {private final char value[];// ...
}
4. 字符串修改
由于String不可变,频繁修改会产生大量临时对象,效率低下:
public static void main(String[] args) {// 不推荐的写法String s = "";for(int i = 0; i < 10000; ++i){s += i;}// 推荐使用StringBuilderStringBuilder sb = new StringBuilder();for(int i = 0; i < 10000; ++i){sb.append(i);}
}
5. StringBuilder和StringBuffer
5.1 StringBuilder介绍
StringBuilder是可变的字符串类,方法表:
方法 | 说明 |
---|---|
StringBuffer append(String str) | 在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuffer的变量 |
char charAt(int index) | 获取index位置的字符 |
int length() | 获取字符串的长度 |
int capacity() | 获取底层保存字符串空间总的大小 |
void ensureCapacity(int minimumCapacity) | 扩容 |
void setCharAt(int index, char ch) | 将index位置的字符设置为ch |
int indexOf(String str) | 返回str第一次出现的位置 |
int indexOf(String str, int fromIndex) | 从fromIndex位置开始查找str第一次出现的位置 |
int lastIndexOf(String str) | 返回最后一次出现str的位置 |
int lastIndexOf(String str, int fromIndex) | 从fromIndex位置开始找str最后一次出现的位置 |
StringBuffer insert(int offset, String str) | 在offset位置插入:八种基类类型 & String类型 & Object类型数据 |
StringBuffer deleteCharAt(int index) | 删除index位置字符 |
StringBuffer delete(int start, int end) | 删除[start, end)区间内的字符 |
StringBuffer replace(int start, int end, String str) | 将[start, end)位置的字符替换为str |
String substring(int start) | 从start开始一直到末尾的字符以String的方式返回 |
String substring(int start, int end) | 将[start, end)范围内的字符以String的方式返回 |
StringBuffer reverse() | 反转字符串 |
String toString() | 将所有字符按照String的方式返回 |
常用方法部分代码示例:
public static void main(String[] args) {StringBuilder sb = new StringBuilder("hello");sb.append(" world"); // 追加sb.insert(5, ","); // 插入sb.delete(5, 6); // 删除sb.reverse(); // 反转String result = sb.toString(); // 转为String
}
5.2 面试题
-
String、StringBuffer、StringBuilder的区别
- String不可变,后两者可变
- StringBuffer线程安全,StringBuilder非线程安全
- StringBuilder性能更高
-
创建了多少个String对象
String str = new String("ab"); // 2个(常量池1个,堆1个)
String str = new String("a") + new String("b"); // 6个
6. String类OJ题解
6.1 第一个只出现一次的字符
class Solution {public int firstUniqChar(String s) {int[] count = new int[256];for(int i = 0; i < s.length(); ++i){count[s.charAt(i)]++;}for(int i = 0; i < s.length(); ++i){if(1 == count[s.charAt(i)]){return i;}}return -1;}
}
6.2 最后一个单词的长度
import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext()){String s = sc.nextLine();int len = s.substring(s.lastIndexOf(" ")+1).length();System.out.println(len);}sc.close();}
}
6.3 检测字符串是否为回文
class Solution {public static boolean isValidChar(char ch){return (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9');}public boolean isPalindrome(String s) {s = s.toLowerCase();int left = 0, right = s.length()-1;while(left < right){while(left < right && !isValidChar(s.charAt(left))) left++;while(left < right && !isValidChar(s.charAt(right))) right--;if(s.charAt(left) != s.charAt(right)) return false;left++;right--;}return true;}
}
总结
String类是Java中最重要的类之一,理解其不可变特性、掌握常用方法以及了解StringBuilder/StringBuffer的区别,对于编写高效Java程序至关重要。希望本文能帮助大家全面掌握String类的使用!
JavaSE往期专栏
- Java从入门到“放弃”(精通)之旅——启航①
- Java从入门到“放弃”(精通)之旅——数据类型与变量②
- Java从入门到“放弃”(精通)之旅——运算符③
- Java从入门到“放弃”(精通)之旅——程序逻辑控制④
- Java从入门到“放弃”(精通)之旅——方法的使用⑤
- Java从入门到“放弃”(精通)之旅——数组的定义与使用⑥
- Java从入门到“放弃”(精通)之旅——类和对象全面解析⑦
- Java从入门到“放弃”(精通)之旅——继承与多态⑧
- Java从入门到“放弃”(精通)之旅——抽象类和接口⑨
相关文章:
Java从入门到“放弃”(精通)之旅——String类⑩
Java从入门到“放弃”(精通)之旅🚀——String类⑩ 前言 在Java编程中,String类是最常用也是最重要的类之一。无论是日常开发还是面试,对String类的深入理解都是必不可少的。 1. String类的重要性 在C语言中…...
MVCWebAPI使用FromBody接受对象的方法
近期在做软件升级操作的时候突然想着需要的参数比较多,如果需要参数的话参数比较多,所有想着使用frombody来集合数据统一操作做了个样张希望对您有帮助 代码如下: /// <summary>/// 入口当前文件接口下的操作数据/// </summary>/…...
知识储备-DC综合相关
DC flow相关 要点描述命令区别DC基础版,使用wireloadmodelcompile_ultraDCT 含DC所有非冲突feature(如wlm),按照DC-prefloorplan-DCT流程获取布局信息更精确评估时序收敛 dc_shell -topoDCG含DCT所有feature,多了layer和congestion信息等 dc_…...
力扣-第645题《错误的集合》
一 . 问题描述 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了集合 S 发生错误后的结果。 …...
gem5教程第六章 为ARM扩展gem5 这也是改进gem5的一个基础
本章假设您已经使用gem5构建了一个基本的x86系统,并创建了一个简单的配置脚本。 下载ARM二进制文件 让我们从下载一些ARM基准测试二进制文件开始。从gem5文件夹的根目录开始: mkdir -p cpu_tests/benchmarks/bin/arm cd cpu_tests/benchmarks/bin/arm wget dist.gem5.org/…...
事关数据安全,ARM被爆不可修复漏洞
日前,ARM架构再次被爆出重大安全漏洞,影响波及ARMv8.3架构及以前的所有CPU。该漏洞为硬件级且无法完全修复,如被利用可能造成严重数据泄露风险。 ARM硬件级安全漏洞 来自ARM开发者官网的一项安全更新证实,存在一种名为PACMAN的新型…...
Unity中使用Cinemachine插件创建自由视角相机(freelookCamera)来实现第三人称漫游
1.安装下载Cinemachine插件 2.创建自由相机freelookCamera Follow:为我们的人物 LookAt:相机始终看向的地方,可以新建空物体,放在人物头上, invert:是反向,就是时鼠标移动方向与相机旋转方向一致 在组件最下面的…...
Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战
目录 一、背景与需求二、 Web基础与HTTP协议核心解析2.1 HTTP协议:数据交互的基石2.2 为何爬虫需理解HTTP协议? 三、 Python爬虫实战:Requests库核心用法3.1 安装与环境配置3.2 案例1:GET请求抓取豆瓣电影Top2503.3…...
php基础
文章目录 基本语法基本数据类型:运算符?? 空合并 定义变量字符串操作内置变量\$_SESSION:会话信息\$_GET:获取URL参数 内置函数功能工具类的,utils网络通信类的会话管理类的 基本语法 每一个statement后面以;结尾,与C/C和Java一样注释用//,…...
蓝桥杯17. 机器人塔
机器人塔 原题目链接 题目描述 X 星球的机器人拉拉队有两种服装:A 和 B。 这次他们表演的是“搭机器人塔”,类似下图: AB BA B AA A B BB B B A BA B A B B A组塔规则: A 只能站在 AA 或 BB 的肩上;B 只能站在 AB…...
rpm包管理
1.介绍 rpm用于互联网下包的打包及安装工具,包含在某些Linux发布版中,它生成具有.RPM扩展名的文件.RPM是RedHat Package Manage (RedHat软件包管理公具)的编写 类似windows的setup.exe,这一文件格式名称虽然打上RedHat的标志,但理念是通用的. Linux的…...
es 自动补全
安装拼音分词器 选择es版本对应的pinyin分词器版本 下载后解压,放到es的插件目录下 重启es 自定义分词器 拼音分词器——可选配置 1. 首字母处理配置 keep_first_letter (默认: true) 解释:是否提取每个汉字的首字母组合,用于支持首字母…...
NLTK 文本分类与情感分析
在自然语言处理(NLP)的领域中,文本分类和情感分析是两个非常重要且具有广泛应用的任务。文本分类旨在将文本数据分配到预定义的类别中,而情感分析则专注于确定文本所表达的情感倾向,如积极、消极或中性。Python 的 Nat…...
Android开发常用外部组件及使用指南(上)
文章目录 一、前言二、外部组件的引入方式1. Gradle依赖管理1.1 项目级build.gradle1.2 模块级build.gradle 2. 本地库引入3. 模块化引入 三、网络请求组件1. Retrofit1.1 引入依赖1.2 基本使用1.3 高级特性 2. OkHttp2.1 基本使用2.2 拦截器 四、图片加载组件1. Glide1.1 基本…...
系统架构师2025年论文《系统架构风格》
论企软件架构风格 摘要: 我所在单位是某市主要医院,2017 年 1 月医院决定开发全新一代某市医院预约挂号系统,我担任本次系统的架构师,主要负责整个系统的架构设计工作。该系统旨在优化医院挂号流程,提高患者就医体验,是医院应对医疗信息化变革和提升服务质量的重要举措…...
Linux部署Redis主从
Linux部署Redis主从 1.下载2.安装2.1编译 & 安装 3.修改配置文件4.启动 1.下载 在Redis版本库:https://download.redis.io/releases/ 可根据自己的需求选择下载对应的版本,然后直接下载 2.安装 通过Xftp工具进行上传,选择指定的应用拖…...
【Python 学习笔记】 pip指令使用
系列文章目录 pip指令使用 文章目录 系列文章目录前言安装配置使用pip 管理Python包修改pip下载源 前言 提示:这里可以添加本文要记录的大概内容: 当前文章记录的是我在学习过程的一些笔记和思考,可能存在有误解的地方,仅供大家…...
Django DRF实现用户数据权限控制
在 Django DRF 中使用 ModelViewSet 时,若需实现用户仅能查看和操作自己的数据详情,同时允许所有认证用户访问列表,需结合权限类和动态权限分配。以下是具体步骤: 1. 自定义对象权限类 创建一个 IsOwner 权限类,检查…...
eplan许可证与防火墙安全软件冲突
在使用EPLAN电气设计软件时,有时会遇到许可证与防火墙或安全软件之间的冲突。这种冲突可能导致许可证无法激活或软件无法正常运行,给用户带来诸多不便。本文将为您解析EPLAN许可证与防火墙/安全软件冲突的原因,并提供解决方案,帮助…...
《多Agent架构VS千万字长文本VS深度推理引擎——拆解Coze、通义、Kimi的AI终局博弈密码》
Coze、通义和Kimi终局竞争深度分析 技术路线分野:多Agent协同 vs. 超长文本 vs. 结构化提示 架构差异:三者在技术路线上的侧重点各异,塑造了不同的市场边界。Coze(“扣子”)采用多Agent协同架构,强调插件工…...
《浔川代码编辑器v2.1.0预告》
《浔川代码编辑器v2.1.0预告》 尊敬的浔川代码编辑器用户: 我们很高兴向大家预告即将到来的v2.1.0版本更新计划。以下是各版本的发布时间安排: 版本发布计划 1. **v2.1.0公测版** - 发布时间:待v2.0测试版结束后两周 - 特点:包…...
Python jsonpath库终极指南:json数据挖掘的精准导航仪
Python jsonpath库终极指南:json数据挖掘的精准导航仪 对话实录 小白:(抓狂)这个 JSON 数据有好多层嵌套,怎么快速拿到最里面的值? 专家:(递上探测器)用jsonpath库&…...
QT软件安装(12)
文章目录 一、本章说明二、QT软件包资源三、软件安装教程 一、本章说明 注:本节为【基于STM的环境监测系统(节点云服务器存储QT界面设计)】项目第12篇文章,前面文章已经实现了气体传感数据的采集,并通过4G模块上传至云…...
【人工智能】DeepSeek 的开源生态:释放 AI 潜能的社区协同与技术突破
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 DeepSeek 作为中国 AI 领域的先锋,以其高效的混合专家模型(MoE)和彻底的开源策略,在全球 AI 社区掀起波澜。本文深入剖析 DeepSeek 的开…...
如何选择 Flask 和 Spring Boot
目录 一、选择 Flask 和 Spring Boot 的关键因素如何评价系统的性能1.RPSRPS 的重要性RPS 的评估标准RPS 的计算方法RPS 与并发用户数的关系性能测试中的RPS 2.TPSTPS 的定义TPS 的重要性TPS 与 RPS 的区别TPS 的常见范围计算 TPS 的公式如何提高 TPS 二、后期扩展优化方案Flas…...
在KEIL里C51和MDK兼容以及添加ARM compiler5 version编译器
前言 我们想在一个keil里面可以打开32和51的文件,这样就不需要两个keil了 还有就是现在的keil,比如我用的是5.41的,就没有5版本的处理器,所以要安装 本篇文章我们来详细讲解如何实现上面说的两个内容 准备的东西 1.ARM5编译器 …...
【源码分析】Linux内核ov13850.c
这里写自定义目录标题 1、入口函数:__init sensor_mod_init2、probe函数:ov13850_probe2.1、初始化前的一些准备2.2、设备初始化流程 源码如下 了解运行流程 1、入口函数:__init sensor_mod_init 驱动由 __init 开始 __exit 结束,…...
单片机与FPGA的核心差异、优缺点、编程差异、典型应用场景、选型等对比分析
1. 基本概念差异 单片机(MCU): 基于冯诺依曼/哈佛架构的微控制器,集成CPU、内存、外设接口(如ADC、UART、PWM等),通过软件指令顺序执行任务。 FPGA: 由可编程逻辑单元(…...
PCB规则
PCB封装 原理图绘制完成需要检查 DRC 菜单栏——>设计——>检查 DRC 底部侧边栏——>DRC——>检查 DRC 常见问题: 1)某个导线/网络标签是一个单网络 网络标签名称不一样 网络标签只有一个 引脚没有使用,但是放置了导线 2…...
静态存储区(Static Storage Area)的总结
普通的全局变量未初始化,编译阶段放在com段,链接完后放在bss段 在32位系统中,内核空间为1GB(地址范围:0xC0000000-0xFFFFFFFF),用户空间为3GB 高端内存(HIGHMEM)是32位…...
基于Quill的文档编辑器开发日志(上)——前端核心功能实现与本地存储管理
目录 二、技术选型与架构设计 三、核心功能实现 1. Quill编辑器集成 2. 本地存储管理(DocStorage类) 3. 文档树渲染与事件绑定 四、效果演示与问题总结 一、项目背景 在开发 Taskflow智能Todo系统 的过程中,文档管理模块是核心功能之一…...
Java | 深拷贝与浅拷贝工具类解析和自定义实现
关注:CodingTechWork 引言 在 Java 开发中,对象的拷贝是一个常见的需求,尤其是在处理复杂数据结构时。深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种常见的拷贝方式,它们在实现和…...
《巧用DeepSeek快速搞定数据分析》书籍分享
文章目录 前言内容简介作者简介购书链接书籍目录 前言 随着大数据时代的到来,数据分析和人工智能技术正迅速改变着各行各业的运作方式。DeepSeek作为先进的人工智能模型,不仅在自然语言处理领域具有广泛应用,还在数据分析、图像识别、推荐系…...
skynet.cluster 库函数应用
目录 模块概览核心函数解析1. 节点通信2. 节点配置与监听3. 服务注册与查询4. 远程服务代理 底层机制使用场景示例场景1:跨节点数据存储场景2:动态扩展节点 注意事项 以下是对 cluster.lua 模块的详细解析,涵盖其核心功能、函数用途及使用示例…...
精益数据分析(17/126):精益画布与创业方向抉择
精益数据分析(17/126):精益画布与创业方向抉择 大家好!一直以来,我都希望能和大家一起在创业和数据分析的领域中不断探索、共同进步。今天,我们接着深入学习《精益数据分析》,这次聚焦于精益画…...
同样的接口用postman/apifox能跑通,用jmeter跑就报错500
之前没用过jmeter,第一次用调试压测脚本遇到了问题 一样的接口用postman能跑通,用jmeter跑就报错500,百度很多文章都说是该接口需要加一个‘内容编码’改成utf-8,我加了还是不行 后来我就想到apifox好像有隐藏的header,然后开始比较apifox的…...
编写 Markdown 技术文档示例
文章目录 📄 建议的文档命名规则(文件名)✍️ 如何署名与归属标识示例 OpenShift 安装部署前置条件说明文档说明使用说明 📄 建议的文档命名规则(文件名) OCP_Install_Prerequisites_Ghostwritten-v1.0-20…...
23种设计模式-结构型模式之享元模式(Java版本)
Java 享元模式(Flyweight Pattern)详解 🦋 什么是享元模式? 享元模式是一种结构型模式,它通过共享相同的对象来减少内存消耗,适用于大量细粒度对象的场景。关键思想是缓存重复出现的对象,避免…...
单例模式:确保唯一实例的设计模式
单例模式:确保唯一实例的设计模式 一、模式核心:保证类仅有一个实例并提供全局访问点 在软件开发中,有些类需要确保只有一个实例(如系统配置类、日志管理器),避免因多个实例导致状态混乱或资源浪费。 单…...
gem5-gpu教程04 高速缓存一致性协议和缓存拓扑
高速缓存一致性协议 gem5-gpu 的一大贡献是允许用户灵活地定义 GPU 和 GPU-CPU 间的缓存一致性协议。此功能由 gem5 的 Ruby 模块实现,该模块使用 SLICC 语言定义一致性协议。更多信息请访问 gem5 wiki:[[http://gem5.org/Ruby]]。 缓存拓扑 The topology of the cache hi…...
c++ 互斥锁
为练习c 线程同步,做了LeeCode 1114题. 按序打印: 给你一个类: public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…...
Pytest教程:为什么Pytest要用插件模式?
目录 一、历史背景:测试框架的局限性与Pytest的设计哲学 1.1 早期测试框架的困境 1.2 Pytest的模块化设计 二、横向对比:插件机制如何让Pytest脱颖而出 2.1 与Unittest/Nose的对比 2.2 插件模式的架构优势 三、插件模式的核心优势解析 3.1 可扩展…...
JVM 生产环境问题定位与解决实战(七):实战篇——OSSClient泄漏引发的FullGC风暴
本文已收录于《JVM生产环境问题定位与解决实战》专栏,完整系列见文末目录 引言 在前六篇博客中,我们系统性地学习了 JVM 生产环境问题定位与解决的全套工具链,涵盖jps、jmap、jstat、jstack、jcmd 等基础工具的使用技巧,深入剖析…...
缩放点积注意力
Scaled Dot-Product Attention 论文地址 https://arxiv.org/pdf/1706.03762 注意力机制介绍 缩放点积注意力是Transformer模型的核心组件,用于计算序列中不同位置之间的关联程度。其核心思想是通过查询向量(query)和键向量(key&am…...
一个关于相对速度的假想的故事-7
回到, 它其实还可以写成, 也就是说,把 作为1,它的 倍也是存在和成立的。或者说,如果认为 是某一种单位(虚数 为单位),那么 的平方 显然也是一种单位(-1为单位)…...
LeetCode算法题(Go语言实现)_57
题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 一、代码实现(回溯法) func letterCombinatio…...
从GPT-5到Claude 3:大模型竞赛的下一站是什么?
从GPT-5到Claude 3:大模型竞赛的下一站是什么? 引言 随着人工智能技术的飞速发展,大语言模型(LLM)已经成为推动自然语言处理(NLP)领域进步的关键力量。自2018年OpenAI推出GPT-1以来࿰…...
leetcode - 字符串
字符串 466. 统计重复个数 题目 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如,str ["abc", 3] "abcabcabc" 。 如果可以从 s2( )中删除某些字符使其变为 s1,则称字符串 s1( )可以从字符串 s2 获得。 例如…...
运维打铁:网络基础知识
文章目录 一、网络架构1. 网络架构图2. 各层级功能3. 机房网络常见问题及解决方案 二、交换技术1. 交换技术基础2. 交换技术分类3. 广播域相关概念4. ARP 协议5. 三层交换机6. VLAN(虚拟局域网) 三、路由技术1. 路由器端口类型及功能2. 路由器功能3. 路由…...
黑马商城-微服务笔记
认识微服务 单体架构 微服务架构 微服务拆分 服务拆分原则 什么时候拆分? ●创业型项目:先采用单体架构,快速开发,快速试错。随着规模扩大,逐 渐拆分。 ●确定的大型项目:资金充足,目标明确&a…...