字符串常见操作
1)获取字符串长度
使用 length() 方法获取字符串长度,例如,想要获取字符串 s1 的长度,就是 s1.length()
相关代码为:
public class L {
public static void main(String[] args) {
//定义一个字符串
String s1 = "一二三四五";
//输出字符串长度
System.out.println("s1的长度为"+s1.length());
}
}
运行结果为:
s1的长度为5
注意:一个空格也计入一个长度
2)获取字符串指定下标的字符
使用 charAt() 方法获取字符串指定下标的字符,例如,想要获取字符串 s1 的指定下标的字符,就是 s1.charAt( 下标 )
相关代码为:
public class C {
public static void main(String[] args) {
//定义一个字符串
String s1 = "一二三四五";
//输出字符串下标为 2 的字符
System.out.println("s1下标为 2 的字符为:"+ s1.charAt(2));
}
}
运行结果为:
s1下标为 2 的字符为:三
3)比较字符串的内容
-
比较字符串是否相等
比较两个字符串是否相等,实际上是仅仅想要比较两个字符串内容是否相等,这个时候我们需要使用 equals() 方法而不能是 == 关系运算符
equals() 方法:比较字符串内容
== 关系运算符:比较字符串地址
相关代码程序为:
public class XiangDeng {
public static void main(String[] args) {
//定义三个字符串变量
String s1 = "Hello";
String s2 = "Hello";
String s3 = "HELLO";
//s1与s2进行比较,并输出比较结果
System.out.println("==比较s1s2是否相等:"+(s1==s2));//结果为true(纯属巧合)
System.out.println("equals比较s1s2是否相等:"+s1.equals(s2));//结果为true
//s1与s3进行比较,并输出结果
System.out.println("equals比较s1s3是否相等:"+s1.equals(s3));//结果为false
System.out.println("equalsIgnoreCase比较s1s3是否相等:"+s1.equalsIgnoreCase(s3));//结果为true
}
}
运行结果为:
==比较s1s2是否相等:true
equals比较s1s2是否相等:true
equals比较s1s3是否相等:false
equalsIgnoreCase比较s1s3是否相等:true
从代码可以得出,字符串 s1 与 s2 内容一致,所以 equals() 方法比较结果为 true ,可是为什么== 关系运算符比较的两个字符串的内存地址,结果居然也为 true 呢?其实吧,这仅仅是个巧合,只是在 Java 编译器在编译时,会自动把所有相同的字符串当作一个对象放入常量池,字符串 s1 与 s2的引用地址就是相同的,结果才为 true ,所以,这个纯纯巧合,换一种写法,== 关系运算符比较就会返回 false
从代码可以得出,字符串 s1 与 s3 看大小写时内容不一致,所以equals() 方法比较结果为 false,不看大小写时内容一致,不看大小写比较是否相等,使用 equalsIgnoreCase() 方法,比较结果为 true
-
比较字符串大小
两个字符串大小比较,使用 comparaTo() 方法,若两个字符串 s1与 s2 进行大小比较
s1.compareTo(s2)运行结果 | 得出结论 |
正数 | s1 > s2 |
0 | s1 = s2 |
负数 | s1 < s2 |
相关程序为:
public class C {
public static void main(String[] args) {
//定义四个字符串
String s1 = "ABC";
String s2 = "DEF";
String s3 = "CDE";
String s4 = "CDE";
//比较两个字符串大小并输出结果
System.out.println("s1与s2大小比较结果为:" + s1.compareTo(s2));//-3说明s1小于s2
System.out.println("s2与s1大小比较结果为:" + s2.compareTo(s1));//3说明s2大于s1
System.out.println("s3与s4大小比较结果为:" + s3.compareTo(s4));//0说明s3等于s4
}
}
运行结果为:
s1与s2大小比较结果为:-3
s2与s1大小比较结果为:3
s3与s4大小比较结果为:0
4)转换成大写或者小写
使用 toUpperCase() 方法转换字符串内容为大写;使用 toLowerCase() 方法转换字符串内容为小写
相关程序为:
public class C {
public static void main(String[] args) {
//定义两个字符串
String s1 = "ABC";
String s2 = "def";
//将s1转换成小写并输出
System.out.println("将s1转换成小写:"+s1.toLowerCase());
//将s2转换成大写并输出
System.out.println("将s2转换成大写:"+s2.toUpperCase());
}
}
运行结果为:
将s1转换成小写:abc
将s2转换成大写:DEF
5)截取部分字符串
使用 substring() 方法,比如截取字符串s1
截取 s1 从 指定下标位置 截取至字符串的尾部 | s1.substring(指定下标位置) |
截取 s1 从 指定下标位置 截取至另一个指定下标位置 | s1.substring(指定下标位置,另一个指定下标位置) |
相关运行代码为:
public class C {
public static void main(String[] args) {
//定义一个String字符串
String s1 = "123456789";
//截取字符串从下标2位置至字符串尾部并输出
System.out.println("截取从下标2位置至字符串尾部:"+s1.substring(2));
//截取字符串从下标3位置至下标6位置(不含下标6位置)
System.out.println("截取从下标3位置至至下标6位置(不含下标6位置):"+s1.substring(3,6));
}
}
运行结果为:
截取从下标2位置至字符串尾部:3456789
截取从下标3位置至至下标6位置(不含下标6位置):456
6)搜索查找字符串
-
查找指定字符串下标位置
从字符串头部开始查找指定子字符串,使用 indexOf() 方法,返回值为 int 类型;
从字符串尾部开始查找指定子字符串,使用 lastIndexOf() 方法,返回值为 int 类型;
无论 indexOf() 方法还是 lastIndexOf() 方法,都可以返回查找到的 指定子字符串下标 位置,如果字符串中存在 指定子字符串 ,则返回该 指定子字符串 所在位置下标;若字符串中不存在 指定子字符串 ,则返回 -1 ,表示未找到 指定子字符串
相关代码程序为:
public class C {
public static void main(String[] args) {
//定义一个字符串
String s1 = "ABCDEFG";
//从首位开始搜查DE子字符串下标位置并输出
System.out.println("从首位开始搜查DE子字符串下标位置为:"+s1.indexOf("DE"));//3
//从尾位开始搜查DE子字符串下标位置并输出
System.out.println("从尾位开始搜查DE子字符串下标位置为:"+s1.lastIndexOf("DE"));//3
//从首位开始搜查XY子字符串下标位置并输出
System.out.println("从首位开始搜查XY子字符串下标位置为:"+s1.indexOf("XY"));//-1(不存在)
}
}
运行结果为:
从首位开始搜查DE子字符串下标位置为:3
从尾位开始搜查DE子字符串下标位置为:3
从首位开始搜查XY子字符串下标位置为:-1
-
判断字符串是否 以 指定子字符串 开头 或 结尾
startsWith() 方法用于判断字符串是否 以 指定子字符串 开头,返回值为 boolean 类型;
endsWith() 方法用于判断字符串是否 以 指定子字符串 结尾,返回值为 boolean 类型;
相关代码程序为:
public class C {
public static void main(String[] args) {
String s1 ="ABCDEF";
//判断字符串是否以AB开头,并输出结果
System.out.println("s1是否以AB开头"+s1.startsWith("AB"));
//判断字符串是否以EF开头,并输出结果
System.out.println("s1是否以EF开头"+s1.startsWith("EF"));
//判断字符串是否以AB结尾,并输出结果
System.out.println("s1是否以AB结尾"+s1.endsWith("AB"));
//判断字符串是否以EF结尾,并输出结果
System.out.println("s1是否以EF结尾"+s1.endsWith("EF"));
}
}
运行结果为:
s1是否以AB开头true
s1是否以EF开头false
s1是否以AB结尾false
s1是否以EF结尾true
-
查找当前字符串中是否 存在 指定子字符串
使用 contains() 方法可以查找当前字符串中是否存在 指定子字符串,返回值为 boolean 类型
相关代码程序为:
public class C {
public static void main(String[] args) {
//定义一个String字符串
String s1 = "123456789";
//判断s1中是否存在“23”并输出结果
System.out.println("s1中是否存在“23”:"+s1.contains("23"));
//判断s1中是否存在“25”并输出结果
System.out.println("s1中是否存在“25”:"+s1.contains("25"));
}
}
运行结果为:
s1中是否存在“23”:true
s1中是否存在“25”:false
7)去除首尾空白字符
-
移除空字符串
使用 trim() 方法可以移除字符串首尾空白字符。首尾空白字符包括空格、\t、\r、\n
注意:trim() 方法并没有改变字符串的内容,而是返回了一个新字符串
相关代码程序为:
public class C {
public static void main(String[] args) {
//定义一个含有空字符串的String字符串
String s1 = "13468 \n\r\t";
//输出原字符串s1
System.out.printf("原字符串s1为:%s;s1长度为:%d\n",s1,s1.length());
//去掉s1的空字符串并输出
System.out.printf("去掉s1的空字符串后为:%s;长度为:%d",s1.trim(),s1.trim().length());
}
}
运行结果为:
原字符串s1为:13468
;s1长度为:9
去掉s1的空字符串后为:13468;长度为:5
-
判断字符串是否为空字符串
使用 isEmpty() 方法可以判断字符串是否为 空字符串 ,返回值为 boolean 类型
相关代码程序为:
public class C {
public static void main(String[] args) {
//定义两个字符串s1和s2,s1为空
String s1 = "";
String s2 = "ABC";
System.out.println("s1为空:"+s1.isEmpty());
System.out.println("s2为空:"+s2.isEmpty());
}
}
运行结果为:
s1为空:true
s2为空:false
8)替换字符串
-
使用 replace() 方法进行替换
例如:对于命名为s1的字符串 “hello” ,想要把 “h” 换成 “H” ,就可以进行这样的操作:
s1.replace( ‘h' , 'H' )
相关代码程序为:
public class C {
public static void main(String[] args) {
//定义一个字符串s1
String s1 = "hello";
//将 'h' 替换为 'H',输出结果
System.out.println("将 'h' 替换为 'H'的结果为:"+s1.replace('h', 'H'));
}
}
运行结果为:
将 'h' 替换为 'H'的结果为:Hello
-
通过正则表达式替换
使用 replaceAll() 方法使用“正则表达式”进行匹配
相关代码程序为:
public class C {
public static void main(String[] args) {
String n1 = "A,D.H&Y,,4,2,8.3";
//replaceAll()方法使用“正则表达式”进行匹配
//[\\,\\.\\&]匹配到3个字符内容
//比如 ww23849将w替换@,输出为@@23849
//[\\,\\.\\&]+匹配到多个字符内容
//比如 ww23849将w替换@,输出为@23849
String ret1 = n1.replaceAll("[\\,\\.\\&]","@");
String ret2 = n1.replaceAll("[\\,\\.\\&]+","@");
System.out.println(" n1:"+n1);
System.out.println("ret1:"+ret1);
System.out.println("ret2:"+ret2);
}
}
运行结果为:
n1:A,D.H&Y,,4,2,8.3
ret1:A@D@H@Y@@4@2@8@3
ret2:A@D@H@Y@4@2@8@3
9)分割字符串
使用 split() 方法分割字符串,注意传入的是“正则表达式”
相关代码程序为:
import java.util.Arrays;
//分割字符串
public class B02 {
public static void main(String[] args) {
String city1 = "西安,咸阳,北京,广东,上海,哈尔滨";
String city2 = "西安+咸阳+北京+广东+上海+哈尔滨";
String city3 = "西安P咸阳R北京M广东B上海A哈尔滨";
String city4 = "西安11咸阳22北京3广东5上海888哈尔滨";
//按照正则表达式进行分割
String[] C1 = city1.split("\\,");
String[] C11 = city1.split(",");
System.out.println("city1为:"+city1);
System.out.println("city1分割后为:"+Arrays.toString(C1));
System.out.println("city1分割后为:"+Arrays.toString(C11));
//按照正则表达式的特殊字符进行分割
String[] C2 = city2.split("\\+");
// String[] C22 = city2.split("+");//结果出错
//+属于正则表达式的特殊字符,必须\\转义使用
System.out.println("city2为:"+city2);
System.out.println("city2分割后为:"+Arrays.toString(C2));
String[] C3 = city3.split("[A-Z]");
System.out.println("city3为:"+city3);
System.out.println("city3分割后为:"+Arrays.toString(C3));
String[] C4 = city4.split("[1-9]+");
System.out.println("city4为:"+city4);
System.out.println("city4分割后为:"+Arrays.toString(C4));
}
}
运行结果为:
city1为:西安,咸阳,北京,广东,上海,哈尔滨
city1分割后为:[西安,咸阳,北京,广东,上海,哈尔滨]
city1分割后为:[西安,咸阳,北京,广东,上海,哈尔滨]
city2为:西安+咸阳+北京+广东+上海+哈尔滨
city2分割后为:[西安, 咸阳, 北京, 广东, 上海, 哈尔滨]
city3为:西安P咸阳R北京M广东B上海A哈尔滨
city3分割后为:[西安, 咸阳, 北京, 广东, 上海, 哈尔滨]
city4为:西安11咸阳22北京3广东5上海888哈尔滨
city4分割后为:[西安, 咸阳, 北京, 广东, 上海, 哈尔滨]
10)拼接字符串
使用 join() 方法拼接字符串
String.join("用于拼接连接的自定义内容",要拼接的数组名称)
相关代码程序为:
public class C {
public static void main(String[] args) {
String[] ns = {"h","e","l","l","o"};
String s1 = String.join("@", ns);
System.out.println("拼接后的ns字符串为:"+s1);
}
}
运行结果为:
拼接后的ns字符串为:h@e@l@l@o
11)格式化字符串
通过·String.format() 方法,格式化字符串,可以自定义字符串形式
相关代码程序为:
public class C {
public static void main(String[] args) {
System.out.println(String.format("%s的%s很好看,我%d天追完了!", "成毅","莲花楼",7));
}
}
运行结果为:
成毅的莲花楼很好看,我7天追完了!