JAVA学习*String类
String类
基本知识
String类的构造方法
String类的构造方法有很多,我们需要掌握常见的构造方法,来赋初识值。
1、new一个String类的对象
String name = new String("张三");
2、使用字符串常量进行赋值
String name = "张三";
相当于第一点的简化版
3、使用字符数组
char[] array = {'l','i','s','i'};
String name = new String(array);
System.out.println(name);//输出:lisi
4、使用字节数组
byte[] array = new byte[]{97,98,99,100,101};
String name = new String(array);
System.out.println(name);//输出:abcde
97 ~ 122 : a ~ z
65 ~ 90 : A ~ Z
48 ~ 57 : 0 ~ 9
字符串常量池
用于存储字符串常量值。当代码中使用双引号定义一个字符串时,Java 首先会检查字符串常量池中是否已经存在相同内容的字符串。如果存在,则直接返回该字符串的引用;如果不存在,则在常量池中创建一个新的字符串对象,并返回其引用。
String name1 = "abc";
String name2 = "abc";
System.out.println(name1 == name2);//输出:true
naem1 和 name2 都是通过双引号直接定义的字符串常量,它们指向字符串常量池中的同一个对象,因此使用 == 比较时返回 true。
在之前这个这样的代码:
String str1 = new String("abc");
String str2 = new String("abc");
System.out.println(str1 == str2);//输出false
str1 和 str2 是通过 new 关键字创建的字符串对象,它会在堆内存中创建一个新的对象,而不是从常量池中获取,所以 str1 和 str2 指向不同的对象,== 比较结果为 false。
常用方法
字符串比较
1、==比较
public static void test1() {String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);//输出;true
}
图片如下:

public static void test2() {String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1 == str2);//输出;false
}
图片如下:(可以这么理解,但可能会存在一些问题)

2、equals()方法比较
3、compareTo()方法比较
这些之前都有提及过,这里不再说明。
4、compareToIgnoreCase()方法比较
调用方式和compareTo()一样,但这个比较忽略大小写。
String str1 = "abcd";
String str2 = "AbcD";
System.out.println(str1.compareToIgnoreCase(str2));//输出:0(表示忽略大小写相同)
求字符串长度
length()
public static void test1() {String str1 = "abc";System.out.println(str1.length());//输出:3
}
字符查找
charAt(int index)
返回index下标位置上的字符(方法会将字符串转换为字符数组),如果越界就会报错(StringIndexOutOfBoundsException)
String str1 = "abcd";
char ch = str1.charAt(3);
System.out.println(ch);//输出:d
indexOf()
indexOf(int ch)
返回ch第一次出现的位置,没有返回-1;
String str1 = "abcdefabcdabc";
System.out.println(str1.indexOf('b'));//输出:1
在类中存在重载的方法。
indexOf(int ch,int fromIndex)
从fromIndex下标开始找,返回ch第一次出现的位置,没有返回-1;
String str1 = "abcdefabcdabc";
System.out.println(str1.indexOf('b',5));//输出:7
indexOf(String str)
返回str第一次出现的首字符的位置,没有返回-1;
String str1 = "abcdefabcdabc";
System.out.println(str1.indexOf("fa"));
indexOf(String str,int fromIndex)
从fromIndex下标开始找,返回str第一次出现的首字符的位置,没有返回-1;
String str1 = "abcdefabcdabc";
System.out.println(str1.indexOf("fa"),7);//输出:-1
lastIndexOf()
lastIndexOf(int ch)
从后面开始查找,返回ch第一次出现的位置,没有返回-1;
String str1 = "abcdefabcdabc";
System.out.println(str1.lastIndexOf('b'));//输出:11
lastIndexOf(int ch,int fromIndex)
从fromIndex下标开始找,从后面开始查找,返回ch第一次出现的位置,没有返回-1;
String str1 = "abcdefabcdabc";
System.out.println(str1.lastIndexOf('b'),6);//输出:1
lastIndexOf(String str)
从后面开始查找,返回str第一次出现的首字符的位置,没有返回-1;
String str1 = "abcdefabcdabcfa";
System.out.println(str1.lastIndexOf("fa"));//输出:13
lastIndexOf(String str,int fromIndex)
从fromIndex下标开始找,从后面开始查找,返回str第一次出现的首字符的位置,没有返回-1;
String str1 = "abcdefabcdabc";
System.out.println(str1.lastIndexOf("fa",7));//输出:5
转换
数值和字符串转换
在数据类型的字符串类型中有所讲到。
这里只补充一个
System.out.println(String.valueOf(new Student("lisi", 18)));

这里会调用Student类重写的toString()方法。
大小写转换
toLowerCase()方法和toUpperCase()方法
public static void main(String[] args) {String name = "WorD";System.out.println(name.toLowerCase());System.out.println(name);System.out.println(name.toUpperCase());System.out.println(name);
}
输出:
word
WorD
WORD
WorD
字符串转字符数组
toCharArray()方法
public static void test2() {String name = "zhangsan";//字符串转字符数组char[] chars = name.toCharArray();for (char ch:chars) {System.out.print(ch);}System.out.println();//字符数组转字符串String str = new String(chars);System.out.println(str);
}
格式化输出
String.format()方法
public static void test3() {String date = String.format("%d/%d/%d",2025,3,24);System.out.println(date);
}
字符串替换
replace()方法、replaceAll()方法、replaceFirst()方法。
public static void test4() {String name = "张三丰";System.out.println(name.replace('张', '李'));//可串字符System.out.println(name.replace("张三", "李四"));//可串字符串String str = "ab_cd_ab";System.out.println(str.replaceAll("ab", "hahaha"));//替换所有匹配的字符串System.out.println(str.replaceFirst("ab", "hahaha"));//替换第一个匹配成功的字符串
}
字符串拆分
split()方法
public static void test5() {String str = "Hello word Java";String[] string = str.split(" ");for (String s:string) {System.out.println(s);}System.out.println("---------");String[] string1 = str.split(" ",10);//最多拆分成10组for (String s:string1) {System.out.println(s);}System.out.println("---------");String[] string2 = str.split(" ",2);//最多拆分成2组for (String s:string2) {System.out.println(s);}
}
输出:
Hello
word
Java
---------
Hello
word
Java
---------
Hello
word Java
注意:
当拆分的节点为特殊字符时,需要用\进行转义。
eg.
1、| * +,在前面加上\\
public static void test6() {String str = "1 + 3 = 2 + 2";String[] string = str.split("\\+");for (String s:string) {System.out.println(s);}
}
2、\,需要用\\\进行转义。
public static void test7() {String str = "2025\\3\\24";String[] string = str.split("\\\\");for (String s:string) {System.out.println(s);}
}
3、如果⼀个字符串中有多个分隔符,可以用|作为连字符
public static void test7() {String str = "2025\\3\\24+2025";String[] string = str.split("\\\\|\\+");for (String s:string) {System.out.println(s);}
}
字符串截取
substring()方法
public static void test8() {String name = "zhangsan";System.out.println(name.substring(5));System.out.println(name.substring(5,8));//返回 String,生成一个新的字符串对象System.out.println(name.subSequence(5,8));//返回CharSequence接口类型,没有生成一个新的字符串对象
}
注意:这里下标写8没有报错,说明截取范围为[5,8)。
去掉首尾空格
trim()方法
public static void test9() {String name = " zhang san ";System.out.println(name.trim());
}
输出:
zhang san
intern()方法
intern()的作用是:将字符串放入字符串常量池 或者 返回该池中已有的相同字符串引用。
1、如果存在相同内容的字符串,intern() 方法会返回该字符串的引用。
2、如果字符串常量池中不存在相同内容的字符串,JVM 会将这个字符串加入池中,并返回该字符串的引用。
public static void test3() {char[] ch = new char[]{'a', 'b', 'c'};String s1 = new String(ch);String s2 = "abc";System.out.println(s1 == s2);
}

输出:
false
public static void test3() {char[] ch = new char[]{'a', 'b', 'c'};String s1 = new String(ch);s1.intern();String s2 = "abc";System.out.println(s1 == s2);
}

输出:
true
public static void test3() {String s2 = "abc";char[] ch = new char[]{'a', 'b', 'c'};String s1 = new String(ch);s1.intern();System.out.println(s1 == s2);
}
当将顺序调换时,输出结果发生变化,输出false。
为什么呢?
调用 intern() 时,发现字符串常量池已存在 “abc”,不会修改常量池(不做任何操作)。此时 s1 仍指向堆中的对象,而 s2 指向常量池中的对象。
字符串不可变性
String是一种不可变的对象,字符串中的内容是不可改变。
所以当对字符串内容进行修改的操作都是创建了一个新的对象,改变的就是这个新的对象。
字符串修改
代码分析
public static void test4() {String name = "zhang";name = "zhang" + "san";System.out.println(name);
}
对于"zhang" + "san"这一步来说,相当于创建了一个新的对象。并没有直接对字符串"zhang"进行修改。当new的对象多了,会造成运行效率降低。为了解决这一问题,提供了StringBuffer和StringBuilder
public static void test6() {String str1 = "+";for (int i = 0; i < 100; i++) {str1 +="+";//new了100次新对象}System.out.println(str1);//StringBuffer str2 = "+";//不支持这样直接赋值;StringBuffer str2 = new StringBuffer("+");for (int i = 0; i < 100; i++) {str2.append("+");}System.out.println(str2);//StringBuffer str2 = "+";//不支持这样直接赋值;StringBuilder str3 = new StringBuilder("+");for (int i = 0; i < 100; i++) {str3.append("+");}System.out.println(str3);
}
注意:
1、 对于StringBuffer和StringBuilder是不支持直接用字符串赋值的
StringBuffer str2 = "+";//不支持这样直接赋值;
StringBuilder str3 = "+";//不支持这样直接赋值;
2、对于append()就是将参数的字符串表示附加到此序列。
3、这时候就会问了:StringBuffer和StringBuilder的append方法不是一样的吗?
我们分别查看其的方法。

发现StringBuffer中多了修饰符synchronized。具体表示什么意思之后再提及。
4、我们还发现了再append方法中都返回的是this,说明此修改字符串并没有创建新的对象。
StringBuffer类和StringBuilder类中的内置方法
对于具体的内容可以通过帮助文档、AI等来查找。
append()
public static void test7() {StringBuffer str1 = new StringBuffer("hello");str1.append(" word!");System.out.println(str1);str1.append(2025);System.out.println(str1);
}
输出:
hello word!
hello word!2025
deleteCharAt(int index)
删除index位置字符
public static void test8() {StringBuffer str1 = new StringBuffer("hello");System.out.println(str1.deleteCharAt(1));
}
输出:hllo
delete(int start,int end)
删除[start,end)区间内字符
public static void test9() {StringBuffer str1 = new StringBuffer("hello");System.out.println(str1.delete(0,1));//删除[0,1)
}
输出:ello
reverse()
反转字符串
public static void test10() {StringBuffer str1 = new StringBuffer("hello");System.out.println(str1.reverse());
}
输出:olleh
相关文章:
JAVA学习*String类
String类 基本知识 String类的构造方法 String类的构造方法有很多,我们需要掌握常见的构造方法,来赋初识值。 1、new一个String类的对象 String name new String("张三");2、使用字符串常量进行赋值 String name "张三";相当…...
Java IO框架体系深度解析:从四基类到设计模式实践
Java IO框架体系深度解析:从四基类到设计模式实践 一、IO流体系架构总览 1.1 四基类设计哲学 Java IO框架以InputStream、OutputStream、Reader、Writer四个抽象类为根基,构建了完整的流式IO体系。这种设计体现了以下核心原则: 抽象分层&a…...
【读书笔记】华为《从偶然到必然》
note 华为的成功并非偶然,而是通过IPD体系、投资组合管理、平台战略等系统性工具,将研发投资转化为可持续的商业竞争力。书中强调的“管理即内部因素”理念,揭示了企业规模扩张与管理能力匹配的深层规律,为高科技企业提供了可借鉴…...
failed to load steamui.dll”错误:Steam用户的高频崩溃问题解析
当你满心欢喜地双击 Steam 图标,准备进入游戏世界时,屏幕上突然弹出 “failed to load steamui.dll” 的刺眼提示——这是全球数百万 Steam 用户最不愿见到的错误之一。作为 Steam 客户端的核心界面动态链接库文件,steamui.dll 的缺失或损坏会…...
Linux多线程详解
Linux多线程详解 一、Linux多线程概念1.1 什么是线程1.2 进程和线程1.3 进程的多个线程共享1.4 进程和线程的关系 二、Linux线程控制2.1 POSIX线程库2.2 线程创建2.3 获取线程ID pthread_self2.4 线程等待pthread_join2.5 线程终止2.6 线程栈 && pthread_t2.7 线程的局…...
权限提升—Windows权限提升土豆家族溢出漏洞通杀全系
前言 OK,Java安全更新不下去了,实在是太难啦啊,想起来提权这一块没怎么更新过,接下来都主要是更新提权这一块的文章了,Java安全的话以后有耐心再搞了。 手动提权 今天主要是讲这个手动的提权,手动提权相…...
JVM(基础篇)
一.初识JVM 1.什么是JVM JVM全称Java Virtyal Machine,中文译名 Java虚拟机 。JVM本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件(将字节码解释成机器码)。 2.JVM的功能 解释和运行:对字节码文件中的指令号,实时…...
cf1007-D
__builtin_ctzll(x)可以用((int)log2(x&-x))代替 void solve() {int n;i64 l, r;std::cin >> n >> l >> r;std::vector<int> a(n 1);for (int i 1; i < n; i) {std::cin >> a[i];}std::vector<int> pre(n 1);for (int i 1; i …...
【Unity网络编程知识】使用Socket实现简单TCP通讯
1、Socket的常用属性和方法 创建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用属性 1)套接字的连接状态 socketTcp.Connected 2)获取套接字的类型 socketTcp.So…...
深入解析SSL/TLS证书:构建现代网络安全的密码学基石1.1 TLS 1.3握手流程优化
一、协议层深度解析:TLS握手全流程拆解 1.1 TLS 1.3握手流程优化 (此处展示TLS 1.3握手流程图,使用Mermaid语法) Client Server ClientHello (supported_versions, cipher_suites, key_share) ServerHello (selected_version, ci…...
【深度学习】GAN生成对抗网络:原理、应用与发展
GAN生成对抗网络:原理、应用与发展 文章目录 GAN生成对抗网络:原理、应用与发展1. 引言2. GAN的基本原理2.1 核心思想2.2 数学表达2.3 训练过程 3. GAN的主要变体3.1 DCGAN (Deep Convolutional GAN)3.2 CGAN (Conditional GAN)3.3 CycleGAN3.4 StyleGAN…...
Live555+Windows+MSys2 编译Androidso库和运行使用(二,实验篇)
文章目录 实验下载推流服务端版本运行 摘要:书接上回 https://blog.csdn.net/qq_20330595/article/details/146412411?spm1001.2014.3001.5502 我们先做几个试验,方便我们理解rtsp推流,先把采集和播放体验一下,我们最后回到代码…...
树莓派ollama docker报错尝试网上方法
ollama ps运行bash:ollama:未找到命令 sudo curl -sSL https://get.docker.com | sh 显示“连接被对方重置” sudo docker run hello-world测试 sudo: docker找不到命令 ollama pull qwen2:7b push:ollama 未找到命令 安装 docker sudo apt update sudo apt …...
工作杂谈(十七)——研发阶段术语
EVT/DVT/PVT/MP是指在制造行业一个产品研发导入从试产到量产的不同阶段: EVT:Engineering Verification Test工程验证测试阶段 DVT:Design Verification Test设计验证测试 PVT:Production Verification Test 小批量生…...
Spring MVC:从历史演变到实战入门
1. Java Web的发展历史与MVC模式 1.1 Model I与Model II的演进 Model I(JSPJavaBean) 作为早期Java Web开发的主流模式,其核心架构如下: graph LR A[客户端] --> B[JSP页面] B --> C{业务逻辑} C --> D[JavaBean] D -…...
C++中的std::move函数详解:移动语义与资源管理
在C中,std::move 是一个用于将对象转换为右值引用的函数模板,通常用于实现资源的转移(如动态内存、文件句柄等),从而避免不必要的拷贝操作。std::move 是C11引入的一个重要特性,主要用于支持移动语义。 目录…...
2025 polarctf春季个人挑战赛web方向wp
来个弹窗 先用最基础的xss弹窗试一下 <script>alert("xss")</script>没有内容,猜测过滤了script,双写绕过一下 <scrscriptipt>alert("xss")</scscriptript>background 查看网页源代码 查看一下js文件 类…...
RabbitMQ 学习整理1 - 基础使用
项目代码:RabbitMQDemo: 学习RabbitMQ的一些整理 基本概念 RabbitMQ是一种基于AMQP协议的消息队列实现框架RabbitMQ可以用于在系统与系统之间或者微服务节点之间,进行消息缓存,消息广播,消息分配以及限流消峰处理RabbitMQ-Serve…...
分布式渲染与云渲染:技术与应用的黄金搭档
一、核心概念:先区分再关联 分布式渲染是通过多台设备并行计算拆分渲染任务的技术(如将一帧拆分为 64 个小块,64 台电脑同时渲染); 云渲染是基于云计算的渲染服务,本质是分布式渲染的商业化落地—— 用户无…...
【实战ES】实战 Elasticsearch:快速上手与深度实践-5.2.1 多字段权重控制(标题、品牌、类目)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 电商商品搜索实战:多字段权重控制策略1. 业务场景与核心挑战1.1 典型搜索问题1.2 权重失衡的影响数据 2. 权重控制核心方案2.1 字段权重分配矩阵2.2 多策略组合方…...
如何避免测试数据准备不充分或不可复用
避免测试数据准备不充分或不可复用的关键方法包括明确数据需求、统一数据管理工具、建立数据复用机制、定期维护更新测试数据以及加强团队沟通与协作。 其中,统一数据管理工具对确保数据质量和复用性尤为重要。例如,许多团队采用专门的测试数据管理工具以…...
使用AI一步一步实现若依(23)
功能23:从后端获取路由/菜单数据 功能22:用户管理 功能21:使用axios发送请求 功能20:使用分页插件 功能19:集成MyBatis-Plus 功能18:创建后端工程 功能17:菜单管理 功能16:角色管理…...
C语言的内存模型 (堆区,栈区,静态区,常量区,代码区 )概念讲解
C语言的内存模型分为5个区: 堆区,栈区,静态区,常量区,代码区 。 1、栈区 存放函数的参数值,局部变量等。 由编译器自动分配和释放。通常在函数执行完了就释放了。其操作方式类似于数据结构中的栈。栈内存…...
Vue3 知识点总结
Vue3 知识点总结 1. 核心概念 1.1 Composition API 1.1.1 setup 函数 setup是Vue3中的新的配置项,是组件内使用Composition API的入口在setup中定义的变量和方法需要return才能在模板中使用setup执行时机在beforeCreate之前,this不可用 export defa…...
第一天学爬虫
阅读提示:我今天才开始尝试爬虫,写的不好请见谅。 一、准备工具 requests库:发送HTTP请求并获取网页内容。BeautifulSoup库:解析HTML页面并提取数据。pandas库:保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…...
W、M、C练题笔记(持续更新中)
web here are the flag 点击,页面跳转404.php,用bp抓包访问/flag.php页面,得到flag用base64解码 TryToFindFlag 打开后查看源代码 发现是robots协议,访问robots.txt 访问flllaaa......,得到空白页面,查看…...
CVE-2021-45232未授权接口练习笔记
CVE-2021-45232 是 Apache APISIX Dashboard 中的一个严重权限漏洞,类似于攻击者无需密码即可拿到整个网关系统的“万能钥匙”。攻击者利用此漏洞,可直接操控网关流量转发规则,甚至远程执行代码,引发服务器沦陷。 默认账户密码导致…...
贪心算法——c#
贪心算法通俗解释 贪心算法是一种"每一步都选择当前最优解"的算法策略。它不关心全局是否最优,而是通过局部最优的累积来逼近最终解。优点是简单高效,缺点是可能无法得到全局最优解。 一句话秒懂 自动售货机找零钱:用最少数量的…...
Retrofit中scalars转换html为字符串
简介 在Retrofit中,如果你想直接获取HTML或其他文本格式的响应内容而不是将其映射到一个模型类,ScalarsConverterFactory 就派上用场了。ScalarsConverterFactory 是一个转换器工厂,它能够将响应体转换为Java基本类型如String、Integer或Byte…...
【微服务架构】SpringCloud(七):配置中心 Spring Cloud Config
文章目录 配置中心为什么需要配置中心配置中心介绍 服务搭建基于GITHUB1.创建仓库2.新建微服务作为配置中心服务3.启动测试拉取 匹配规则分支读取 客户端配置配置文件引入依赖使用远程配置 刷新配置手动配置热更新自动刷新erlang安装RabbitMQ安装环境变量管理界面服务配置测试 …...
