【Java】字符串常用操作
字符的常用技巧
char c;
- 字母的顺序:
c - 'A'、c - 'a' - 字母大小写转换:
c - 'a' + 'A'、c - 'A' + 'a' - 数字字符转换为数字:
c - '0'
String、StringBuilder和StringBuffer 三者区别
StringBuilder和StringBuffer非常相似,均代表可变的字符序列,而且方法也一样。
- String:不可变字符序列
- StringBuffer:可变字符序列、效率低、线程安全
- StringBuilder:可变字符序列、效率高、线程不安全
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
这里顺带讲讲String的使用陷阱:
String s = "a";
s = s + "b";
在相加的时候,实际上原来的 "a" 字符串对象已经丢弃了,现在又产生了一个字符串 s+"b" (也就是"ab")。
如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放在循环中,会极大影响程序的性能。
StringBuilder和StringBuffer的常用方法
理解:我们下面展示的常用方法可以看到,StringBuilder是将字符串看作一个一个分离的字符(字节),而不是一个整体。
我们下面的方法都是对字符串局部元素进行操作,如 增:一个一个增加,改:局部替换。
注意:不能直接用扫描器输入StringBuilder和StringBuffer,需要构造函数。
只能StringBuilder sb = new StringBuilder(in.next());,
而不能像String一样,String str = in.next();。
StringBuilder和StringBuffer的方法一样,以下列出了StringBuffer的常用方法:
| 方法 | 返回类型 | 描述 | 备注 |
|---|---|---|---|
| append(String str) | StringBuffer | 追加内容 | 此方法可以添加任何数据类型 |
| insert(int offset, String str) | StringBuffer | 在指定位置处插入指定字符 | |
| reverse() | StringBuffer | 将内容反转保存 | |
| replace(int start, int end, String str) | StringBuffer | 指定内容替换 | |
| delete(int start, int end) | StringBuffer | 删除指定范围的字符串 | |
| substring(int start) | String | 字符串截取,指定开始点 | |
| substring(int start, int end) | String | 截取指定范围的字符串 | |
| indexOf(String str) | int | 查找指定字符串是否存在,返回索引号 | |
| indexOf(String str, int fromIndex) | int | 从指定位置开始查找指定字符是否存在,返回索引号 | |
| length() | int | 求出内容长度 | |
| toString() | String | 将内容变为String类型 | 继承Object类的方法 |
| setCharAt(int index, char ch) | void | 将给定索引处的字符设置为 ch |

增
StringBuffer append(String str):追加内容
此方法可以添加任何数据类型
StringBuffer insert(int offset, String str):在指定位置处插入指定字符
删
StringBuffer delete(int start, int end):删除指定范围的字符串String substring(int start, int end):截取指定范围的字符串
改
void setCharAt(int index, char ch):将给定索引处的字符设置为 chStringBuffer replace(int start, int end, String str):指定内容替换
查
char charAt(int index):将指定索引处的字符返回int indexOf(String str):从指定位置开始查找指定字符是否存在,返回索引号
String的常用方法
理解:String类与上面的StringBuilder类就不一样,String类把字符串当成一个整体,进行整体操作,如替换,都是整体扫描替换。
String类用来存储字符串。
例如:
String a = "Hello";
| 方法 | 返回类型 | 描述 | 备注 |
|---|---|---|---|
| toCharArray() | char[] | 将一个字符串变为字符数组 | 字符串→字符数组 |
| charAt(int index) | char | 将指定索引处的字符返回 | 字符 |
| getBytes() | byte[] | 使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中 | |
| length() | int | 返回此字符串的长度 | 长度 |
| indexOf(String str) | int | 返回指定子字符串在此字符串中第一次出现处的索引(若没有,返回-1) | 可以用来查找此子字符串是否存在 |
| indexOf(String str, int fromIndex) | int | 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 | |
| trim() | String | 返回字符串的副本,忽略前导空白和尾部空白 | |
| replace(char oldChar, char newChar) | String | 用 newChar 替换此字符串中出现的所有 oldChar | replace(" ","")可以用来去掉所有空格 |
| replace(CharSequence target, CharSequence replacement) | String | 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串 | CharSequence是一个接口,实现类有String、StringBuilder、StringBuffer等 |
| substring(int beginIndex) | String | 对字符串进行截取,从begin开始,到结尾结束 | |
| substring(int begin, int end) | String | 对字符串区间[begin, end)进行截取 | 子字符串 |
| equals(String str) | boolean | 判断两个字符串是否相等 | |
| equalsIgnoreCase(String str) | boolean | 不区分大小写比较两个字符串是否相等 | |
| toUpperCase() | String | 将一个字符串全部变成大写字母 | |
| toLowerCase() | String | 将一个字符串全部变为小写字母 | |
| startsWith(String prefix) | boolean | 判断是否以指定字符串开头 | |
| endsWith(String suffix) | boolean | 判断是否以指定字符串结尾 | |
| split(String regex) | String[] | 按指定的正则表达式、分隔字符或字符串对内容进行分割,并将分割后的结果作为字符串数组返回 | 分割字符串 |
| matches(String regex) | boolean | 告知此字符串是否匹配给定的正则表达式 | |
| replaceAll(String regex, String replacement) | String | 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串 | 能替换所有符合正则表达式的子字符串(StringBuilder它们没有) |
增
+
删
String substring(int begin, int end):(子字符串)对字符串区间[begin, end)进行截取对字符串进行截取,从begin开始,到结尾结束String[] split(String regex):(分割字符串)按指定的正则表达式、分隔字符或字符串对内容进行分割,并将分割后的结果作为字符串数组返回。String trim():返回字符串的副本,忽略前导空白和尾部空白
改
修改操作也可以用作删除操作!!
replace(" ","")可以用来去掉所有空格
String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
CharSequence是一个接口,实现类有String、StringBuilder、StringBuffer等
String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
能替换所有符合正则表达式的子字符串(StringBuilder它们没有)
查
char charAt(int index):(字符)将指定索引处的字符返回int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引(若没有,返回-1)
可以用来查找此子字符串是否存在
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始int lastIndexOf(String str):用于返回字符串最后一次出现的索引位置。
字符串常用方法举例
字符串连接
可以直接用+号,如
String a = "Hello";
String b = "world";
System.out.println(a + ", " + b + "!"); // output "Hello, world!"
字符串查找
String提供了两种查找字符串的方法,即 indexOf() 与 lastIndexOf() 方法。
indexOf(String s):用于返回参数字符串 s 在指定字符串中首次出现的索引位置
当调用字符串的indexOf()方法时,会从当前字符串的开始位置搜索 s 的位置。- 如果没有检索到字符串 s,该方法返回-1
String str ="We are students";
int size = str.indexOf("a"); // 变量 size 的值是 3
lastIndexOf(String str):用于返回字符串最后一次出现的索引位置。
当调用字符串的lastIndexOf()方法时,会从当前字符串的开始位置检索参数字符串 str,并将最后一次出现 str 的索引位置返回。- 如果没有检索到字符串 str,该方法返回-1。
- 如果
lastIndexOf()方法中的参数是空字符串"",则返回的结果与 length 方法的返回结果相同。
获取指定索引位置的字符
使用charAt()方法可将指定索引处的字符返回。
String str = "Hello world";
char mychar = str.charAt(5); // mychar 的结果是 w
获取子字符串
通过String类的substring()方法可对字符串进行截取。
这些方法的共同点就是都利用字符串的下标进行截取,且应明确字符串下标是从 0 开始的。在字符串中空格占用一个索引位置。
substring(int beginIndex):从begin开始,到结尾结束String str = "Hello world";
String substr = str.substring(3); //获取字符串,此时 substr 值为 lo world
substring(int beginIndex, int endIndex):begin和end区间是前闭后开的,[begin, end)
注意:其实这个区间前闭后开是针对字符来说的,看下面举的例子,0~3截取了Hel这三个字符,即 [0, 3),第0、1、2个字符。
- beginIndex:开始截取子字符串的索引位置
- endIndex:子字符串在整个字符串中的结束位置
> **理解:**但是,我们可以**从存储机制去理解**它。
Hello World 在系统里是这样存储的:

我们截取了地址0~3,所以截取了Hel这三个字符。
```
String str = "Hello world";
String substr = str.substring(0,3); //substr 的值为 Hel
```
去除空格
trim()方法返回字符串的副本,清除了左右两端的空格。
String str = " hello ";
System.out.println(str.trim());
//程序运行结果:hello
字符串替换
replace(String oldChar,String newChar)方法可实现将指定的字符或字符串替换成新的字符或字符串。
- oldChar:要替换的字符或字符串
- newChar:用于替换原来字符串的内容
注意:如果要替换的字符 oldChar 在字符串中重复出现多次,replace()方法会将所有 oldChar 全部替换成 newChar。需要注意的是,要替换的字符 oldChar 的大小写要与原字符串中字符的大小写保持一致。
String str= "address";
String newstr = str.replace("a", "A");// newstr 的值为 Address
判断字符串是否相等(切不可使用==)
equals(String otherstr):
如果两个字符串具有相同的字符和长度,则使用equals()方法比较时,返回 true。
注意:equals()方法比较时,区分大小写。
equalsIgnoreCase(String otherstr):
注意:
equalsIgnoreCase()方法与equals()类似,不过在比较时忽略了大小写。
equals()与==的区别:
- ==:
- 如果作用于基本数据类型的变量(如 byte,short,char,int,long,float,double,boolean),则直接比较其存储的“值”是否相等;
- 如果作用于引用类型的变量(如 String类),则比较的是所指向的对象的地址(即 是否指向同一个对象)。
- equals()方法:是基类Object中的方法,因此对于所有的继承于Object的类都会有该方法。在Object类中,equals()方法是用来比较两个对象的引用是否相等,即 是否指向同一个对象。
是不是感觉equals()在Object类中跟==好像是一样的描述啊??没错,就是一样的,不是我写错了!
Java中Object类是所有类的父类,它里面定义了equals()方法:
public boolean equals(Object obj) {
return (this == obj);
}
若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。
注意:对于equals()方法,equals()方法不能作用于基本数据类型的变量。
- 如果没有对equals()方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
- 而String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串内容是否相等。
其他的一些自带的引用数据类型,如 Double,Date,Integer等,都对equals()方法进行了重写,用来比较指向的对象所存储的内容是否相等。
按字典顺序比较两个字符串
compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的 Unicode 值,按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。
- 如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数;
- 如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数;
- 如果这两个字符串相等,则结果为0.
String 字符串类型,它的比较值用compareTo方法,它从第一位开始比较,,如果遇到不同的字符,则马上返回这两个字符的ASCII码的差值,返回值是int类型;
一、当两个比较的字符串是英文且长度不等:
1、当长度短的字符与长度长的字符的内容一致时,返回的是两个字符串长度的差值;
a=“hello”;
b=“hell”;
输出值
num=1;
a=“h”;
b=“hello”;
输出值:
num=-4;
2、长度不一样且前几个字符也不一样,从第一位开始找,当找到不一样的字符时,则返回的值是这两个字符比较的值
a=“assdf”;
b=“bdd”;
输出值:
num=-1;
二、当两个比较的字符串是英文且长度相等:
1、只有一个字符:
a=“a”; //97
b=“b”; //98
输出值:
num=-1;
2、多个字符,且第一个字符值不同:(第一个字符不同则只比较第一个字符)
a=“ah”; //a=97
b=“eg”; //e=101
输出值:
num=-4
3、多个字符,第一个字符相同,后面不同(从不同的位置输出比较值,并输出)
a=“ae”; //e=101
b=“aa”; //a=97
输出值:
num=4;
字母大小写转换
- 字符串的
toLowerCase()方法可将字符串中的所有字符从大写字母改写为小写字母, - 而
toUpperCase()方法可将字符串中的小写字母改写为大写字母。
str.toLowerCase();
str.toUpperCase();
字符串分割
使用split()方法可以使字符串按指定的分隔字符或字符串对内容进行分割,并将分割后的结果作为字符串数组返回。
str.split(String regex);:****regex为分割字符串的分割符,也可以使用正则表达式。
注意:没有统一的对字符串进行分割的符号,如果想定义多个分割符,可使用符号“|”。(这个是正则表达式的“或”概念)
例如,“,|=”表示分割符分别为“,”和“=”。
String str = "hello world";
String[] s = str.split(" ");
for(int i=0; i<s.length; i++) {
System.out.println(s[i]);
}
程序运行结果:
hello
world
字符串转化为数字
这里使用的是Integer类的方法Integer.valueOf(String s)。
数字转化为字符串
这里使用的是String类的方法String.valueOf(int i)。
字符串转化为字符数组
char[] chars = s.toCharArray()
字符数组转化为字符串
s = String.valueOf(chars)
总结
总结:
- 如果要操作少量的数据用 String;
- 多线程操作字符串缓冲区下操作大量数据 StringBuffer;
- 单线程操作字符串缓冲区下操作大量数据 StringBuilder。
| 字符串 | 字符序列 | 效率 | 线程 | 线程安全 | 备注 |
|---|---|---|---|---|---|
| String | 不可变 | 低 | String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间 | ||
| StringBuffer | 可变 | 中 | 多线程操作字符串 | 线程安全 | StringBuffer是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量 |
| StringBuilder | 可变 | 高 | 单线程操作字符串 | 线程不安全 | 可变类,速度更快 |
【Java】字符串常用操作的更多相关文章
- 【转】Java 字符串常用操作(String类)
原文网址:http://www.cnblogs.com/freeabyss/archive/2013/05/15/3187057.html 字符串查找 String提供了两种查找字符串的方法,即ind ...
- Java 字符串常用操作(String类)
字符串查找 String提供了两种查找字符串的方法,即indexOf与lastIndexOf方法. 1.indexOf(String s) 该方法用于返回参数字符串s在指定字符串中首次出现的索引位置, ...
- learning java 字符串常用操作
// 字符串索引取值 "; System.)); // 字符串比较 "; "; "; System.out.println(s1.compareTo(s2)); ...
- Python 基礎 - 字符串常用操作
字符串常用操作 今天就介紹一下常用的字符串操作,都是以 Python3撰寫的 首字母變大寫 #!/usr/bin/env python3 # -*- coding:utf-8 -*- name = & ...
- javascript中字符串常用操作整理
javascript中字符串常用操作整理 字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用 ...
- Python学习笔记五:字符串常用操作,字典,三级菜单实例
字符串常用操作 7月19日,7月20日 ,7月22日,7月29日,8月29日,2月29日 首字母大写:a_str.capitalize() 统计字符串个数:a_str.count(“x”) 输出字符, ...
- Python3笔记022 - 5.1 字符串常用操作
第5章 字符串及正则表达式 5.1 字符串常用操作 5.1.1 拼接字符串 使用+运算符可完成多个字符串的拼接,产生一个新的字符串对象. str1 = "2020年07月06日是" ...
- 初识python: 字符串常用操作
直接上代码示例: #!/user/bin env python # author:Simple-Sir # time:20180914 # 字符串常用操作 name = 'lzh lyh' print ...
- JavaScript 字符串常用操作
JavaScript 字符串用于存储和处理文本.因此在编写 JS 代码之时她总如影随形,在你处理用户的输入数据的时候,在读取或设置 DOM 对象的属性时,在操作 Cookie 时,在转换各种不同 Da ...
- javascript中字符串常用操作总结、JS字符串操作大全
字符串的操作在js中非常频繁,也非常重要.以往看完书之后都能记得非常清楚,但稍微隔一段时间不用,便会忘得差不多,记性不好是硬伤啊...今天就对字符串的一些常用操作做个整理,一者加深印象,二者方便今后温 ...
随机推荐
- keycloak~巧用client-scope实现token字段和userinfo接口的授权
keycloak中的client-scope允许你为每个客户端分配scope,而scope就是授权范围,它直接影响了token中的内容,及userinfo端点可以获取到的用户信息,这块我们可以通过自定 ...
- runoob-Docker 教程
https://www.runoob.com/docker/docker-tutorial.html Docker的应用场景 Web 应用的自动化打包和发布. 自动化测试和持续集成.发布. 在服务型环 ...
- css漂亮的弧形
我们有时会遇到要用实现一个弧形,而这样的弧形要怎么实现呢? 用图片?好像不大现实,因为这样就要无故多加载一张图片了 ,这里我们来说说怎么用css的after伪类来实现弧形. 如果想要调整弧度的话,可以 ...
- 【译】轻松评估 AI 应用程序的质量
原文 | Wendy Breiding 翻译 | 郑子铭 在构建利用 AI 的应用程序时,能够有效地评估 SLM(小型语言模型)或 LLM(大型语言模型)的响应从未如此重要. 评估是指评估 AI 模型 ...
- 使用天翼云云容器引擎CCE创建简单nginx服务
本文分享自天翼云开发者社区<使用天翼云云容器引擎CCE创建简单nginx服务>,作者:b****n 一.创建一个nginx应用. 1.选择资源池,如[杭州2],进入云容器引擎CCE平台页面 ...
- Visual Studio各个版本密钥
1.VS2012 旗舰版:YKCW6-BPFPF-BT8C9-7DCTH-QXGWC 2.VS2013 旗舰版:BWG7X-J98B3-W34RT-33B3R-JVYW9 专业版:XDM3T-W3T3 ...
- OI 超几何函数与Gosper算法入门
前言 据说这个东西是 19~20 初世纪数学研究的重大成果与主要研究方向.但是很可惜,由于世界形势的变化,以德国为中心的的超几何函数.椭圆函数研究开始没落于集中于美国.苏联的数学研究飞向. 第一章 定 ...
- 如何基于DeepSeek开展AI项目
关注公众号回复1 获取一线.总监.高管<管理秘籍> 书接上文:DeepSeek怎么突然就比肩GPT了? 最近一直在研究DeepSeek,作为应用层的选手,自然不会傻乎乎的想要去了解底层,我 ...
- LeetCode 题解大全
项目说明 LeetCode 系列题解致力于帮助程序员更好地理解和掌握算法思维,内容包含详细的解题思路分析.图文并茂的示例讲解和完整的代码实现. LeetCode 最全题解:持续更新中,欢迎 Star ...
- WPF DataTemplate DataContext 绑定问题
当使用DataTemplate时,需要用数据绑定,设置数据绑定的方式可参考: https://supportcenter.devexpress.com/ticket/details/t736087/d ...