字符串操作

String 类中包含了很多方法,允许程序员对字符串进行操作来满足实际编程中的需要。本节将讲解几种常见的字符串操作。

获取子字符串

通过 String 类的 substring() 方法可对字符串进行截取。substring() 方法被两种不同的形式重载,以满足不同的需要。这些形式的共同点是,它们都利用字符串的下标进行截取,并且字符串下标是从 0 开始的。

substring(int beginIndex)

该方法返回的是从指定的索引位置开始截取直到该字符串结尾的子串。语法如下:

str.substring(int beginIndex)

其中,beginIndex 指定从某一索引处开始截取字符串。

截取字符串,代码如下:

String str = "Hello World";  //定义字符串str
String substr = str.substring(3);  //获取字符串,此时substr值为lo World

使用 substring(beginIndex) 截取字符串的过程如图10.8所示。

image 2024 03 01 14 12 32 220
Figure 1. 图10.8 substring(3)的截取过程

在字符串中,空格占用一个索引位置。

substring(int beginIndex, int endIndex)

该方法返回的是从字符串某一索引位置开始截取至某一索引位置结束的子串。语法如下:

substring(int beginIndex, int endIndex)
  • beginIndex:开始截取子字符串的索引位置。

  • endIndex:子字符串在整个字符串中的结束位置。

【例10.5】《将进酒》的作者是哪位诗人?(实例位置:资源包\TM\sl\10\5)

在项目中创建 Subs 类,在主方法中创建 String 对象,实现使用 substring() 方法对字符串进行截取,并将截取后形成的新字符串进行输出。实例代码如下:

public class Subs { // 创建类
	public static void main(String args[]) { // 主方法
		String str = "《将进酒》:李白(唐)"; // 定义的字符串
		String substr = str.substring(6, 8); // 对字符串进行截取
		System.out.println("《将进酒》的作者是" + substr); // 输出截取后的字符串
	}
}

运行结果如图10.9所示。

image 2024 03 01 14 14 56 772
Figure 2. 图10.9 例10.5的运行结果

去除空格

trim() 方法返回字符串的副本,忽略前导空格和尾部空格。语法如下:

str.trim()

其中,str为任意字符串对象。

【例10.6】去掉字符串首、尾的空格(实例位置:资源包\TM\sl\10\6)

在项目中创建 Blak 类,在主方法中创建 String 对象,在控制台上输出字符串原来的长度和去掉首、尾空格后的长度。实例代码如下:

public class Blak { // 创建类
	public static void main(String args[]) { // 主方法
		String str = "  Java  class   "; // 定义字符串str
		System.out.println("字符串原来的长度:" + str.length()); // 将str原来的长度输出
		// 将str去掉前导和尾部的空格后的结果输出
		System.out.println("去掉空格后的长度:" + str.trim().length());
	}
}

运行结果如图10.10所示。

image 2024 03 01 14 18 49 114
Figure 3. 图10.10 例10.6的运行结果

替换字符串

replace() 方法可实现将指定的字符或字符串替换成新的字符或字符串。语法如下:

str.replace(CharSequence target, CharSequence replacement)
  • target:要替换的字符或字符串。

  • replacement:用于替换原来字符串的内容。

replace() 方法返回的结果是一个新的字符串。如果字符或字符串 oldChar 没有出现在该对象表达式的字符串序列中,则将原字符串进行返回。

【例10.7】将单词中的字母a替换为字母A(实例位置:资源包\TM\sl\10\7)

在项目中创建 NewStr 类,在主方法中创建 String 型变量,将该变量中的字母 a 替换成 A,并将替换后的字符串进行输出。实例代码如下:

public class NewStr { // 创建类
	public static void main(String args[]) { // 主方法
		String str = "address"; // 定义字符串str
		// 字符串str中的字符“a”替换成“A”后返回新的字符串newstr
		String newstr = str.replace("a", "A");
		System.out.println(newstr); // 将字符串newstr输出
	}
}

运行结果如图10.11所示。

image 2024 03 01 14 21 44 704
Figure 4. 图10.11 例10.7的运行结果

如果要替换的字符 oldChar 在字符串中重复出现多次,那么 replace() 方法会将所有 oldChar 字符全部替换成 newChar。例如:

String str = "java project";
String newstr = str.replace("j","J");

此时,newstr 的值为 Java proJect。

需要注意的是,要替换的字符 oldChar 的大小写要与原字符串中字符的大小写保持一致,否则它不能被成功地替换。例如,如果将上面的实例写成如下语句,则 oldChar 字符不能被成功地替换:

String str = "java project";
String newstr = str.replace("P","t");

判断字符串的开始与结尾

startsWith() 方法与 endsWith() 方法分别用于判断字符串是否以指定的内容开始或结束。这两个方法的返回值都为 boolean 类型。

startsWith()方法

该方法用于判断当前字符串对象的前缀是否为参数指定的字符串。语法如下:

str.startsWith(String prefix)

其中,prefix 是指作为前缀的字符串。

endsWith()方法

该方法用于判断当前字符串是否为以给定的子字符串结束。语法如下:

str.endsWith(String suffix)

其中,suffix 是指作为后缀的字符串。

【例10.8】判断字符串是否以指定的内容开始或结束(实例位置:资源包\TM\sl\10\8)

在项目中创建 StartOrEnd 类,在主方法中创建两个 String 型变量,它们的值分别为 “22045612” 和 “21304578”,先判断 “22045612” 是否是以 “22” 开始的,再判断 “21304578” 是否是以 “78” 结束的。实例代码如下:

public class StartOrEnd { // 创建类
	public static void main(String args[]) { // 主方法
		String num1 = "22045612"; // 定义字符串num1
		String num2 = "21304578"; // 定义字符串num2
		boolean b = num1.startsWith("22"); // 判断字符串num1是否以'22'开头
		boolean b2 = num2.endsWith("78"); // 判断字符串num2是否以'78'结束
		System.out.println("字符串num1是以'22'开始的吗?" + b);
		System.out.println("字符串num2是以'78'结束的吗?" + b2); // 输出信息
	}
}

运行结果如图10.12所示。

image 2024 03 01 14 26 23 414
Figure 5. 图10.12 例10.8的运行结果

判断字符串是否相等

对字符串对象进行比较不能简单地使用比较运算符 “==”,因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也是不同的,使用比较运算符仍然会返回 false。使用比较运算符比较两个字符串,代码如下:

String tom = new String("I am a student");
String jerry = new String("I am a student");
boolean b = (tom == jerry);

此时,布尔型变量 b 的值为 false,因为字符串是对象,tom、jerry 是引用,内存示意图如图10.13所示。因此,要比较两个字符串内容是否相等,应使用 equals() 方法和 equalsIgnoreCase() 方法。

image 2024 03 01 14 30 46 499
Figure 6. 图10.13 内存示意图

equals()方法

如果两个字符串具有相同的字符和长度,则使用 equals() 方法进行比较时,返回 true;否则,返回 false。语法如下:

str.equals(String otherstr)

其中,str、otherstr 是要比较的两个字符串对象。

equalsIgnoreCase()方法

使用 equals() 方法对字符串进行比较时是区分大小写的,而使用 equalsIgnoreCase() 方法是在忽略了大小写的情况下比较两个字符串是否相等的,返回结果仍为 boolean 类型。语法如下:

str.equalsIgnoreCase(String otherstr)

其中,str、otherstr 是要比较的两个字符串对象。

通过下面的例子可以看出 equals() 方法和 equalsIgnoreCase() 方法的区别。

【例10.9】判断“abc”与“ABC”是否相等(实例位置:资源包\TM\sl\10\9)

在项目中创建 Opinion 类,在主方法中创建两个 String 型变量,它们的值分别为 “abc” 和 “ABC”,判断这两个字符串是否相等。实例代码如下:

public class Opinion { // 创建类
	public static void main(String args[]) { // 主方法
		String s1 = new String("abc"); // 创建字符串对象s1
		String s2 = new String("ABC"); // 创建字符串对象s2
		boolean b = s1.equals(s2); // 使用equals()方法比较s1与s2
		// 使用equalsIgnoreCase()方法比较s1与s2
		boolean b2 = s1.equalsIgnoreCase(s2);
		System.out.println(s1 + " equals " + s2 + " :" + b); // 输出信息
		System.out.println(s1 + " equalsIgnoreCase " + s2 + " :" + b2);
	}
}

运行结果如图10.14所示。

image 2024 03 01 14 33 42 747
Figure 7. 图10.14 例10.9的运行结果

按字典顺序比较两个字符串

compareTo() 方法是按字典顺序比较两个字符串的,该比较基于字符串中各个字符的 Unicode 值,按字典顺序将 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。如果按字典顺序此 String 对象位于参数字符串之前,则比较结果为一个负整数;如果按字典顺序此 String 对象位于参数字符串之后,则比较结果为一个正整数;如果这两个字符串相等,则结果为 0。语法如下:

str.compareTo(String otherstr)

其中,str、otherstr 是要比较的两个字符串对象。

compareTo() 方法只有在 equals(Object) 方法返回 true 时才返回 0。

【例10.10】判断字母b的位置(实例位置:资源包\TM\sl\10\10)

在项目中创建 Wordbook 类,在主方法中创建 3 个 String 变量,它们的值分别为 a、b 和 c,使用 compareTo() 方法判断字母 b 的位置,即在字母 a 的后面,在字母 c 的前面。实例代码如下:

public class Wordbook { // 创建类
	public static void main(String args[]) { // 主方法
		// 用于比较的3个字符串
		String str = new String("b");
		String str2 = new String("a");
		String str3 = new String("c");
		System.out.println(str + " compareTo " + str2 + ":" + str.compareTo(str2)); // 将str与str2比较的结果输出
		System.out.println(str + " compareTo " + str3 + ":" + str.compareTo(str3)); // 将str与str3比较的结果输出
	}
}

运行结果如图10.15所示。

image 2024 03 01 14 41 03 879
Figure 8. 图10.15 例10.10的运行结果

字母大小写的转换

String 类的 toLowerCase() 方法可将字符串中的所有大写字母改写为小写字母,而 toUpperCase() 方法可将字符串中的所有小写字母改写为大写字母。

toLowerCase()方法

该方法将字符串中的所有大写字母转换为小写。如果字符串中没有应该被转换的字符,则将原字符串返回;否则将返回一个新的字符串,将原字符串中每个大写字母都转换成小写,字符串长度不变。语法如下:

str.toLowerCase()

其中,str 是要进行转换的字符串。

toUpperCase()方法

该方法将字符串中所有的小写字母转换为大写。如果字符串中没有应该被转换的字符,则将原字符串返回;否则返回一个新字符串,将原字符串中每个小写字母都转换成大写,字符串长度不变。语法如下:

str.toUpperCase()

其中,str 是要进行转换的字符串。

使用 toLowerCase() 方法和 toUpperCase() 方法进行大小写转换时,数字或其他非英文字母类字符不受影响。

【例10.11】字母大小写的转换(实例位置:资源包\TM\sl\10\11)

在项目中创建 UpAndLower 类,在主方法中创建一个值为 “Oh My God” 的 String 型变量,对这个字符串进行字母大小写转换,然后将转换后的结果输出在控制台上。实例代码如下:

public class UpAndLower { // 创建类
	public static void main(String args[]) { // 主方法
		String str = new String("Oh My God"); // 创建的字符串str
		String newstr = str.toLowerCase(); // 使用toLowerCase()方法实行小写转换
		String newstr2 = str.toUpperCase(); // 使用toUpperCase()方法实行大写转换
		System.out.println(newstr); // 将转换后的结果输出
		System.out.println(newstr2);
	}
}

运行结果如图10.16所示。

image 2024 03 01 14 44 08 662
Figure 9. 图10.16 例10.11的运行结果

分割字符串

使用 split() 方法可以使字符串按指定的分割字符或字符串进行分割,并将分割后的结果存储在字符串数组中。split() 方法提供了以下两种字符串分割形式。

split(String sign)

该方法可根据给定的分割符对字符串进行拆分。语法如下:

str.split(String sign)

其中,sign 为分割字符串的分割符,也可以使用正则表达式。

没有统一的对字符进行分割的符号。如果想定义多个分割符,可使用符号 “|”。例如,“,|=” 表示分割符分别为 “,” 和 “=”。

split(String sign,int limit)

该方法可根据给定的分割符对字符串进行拆分,并限定拆分的次数。语法如下:

str.split(String sign,int limit)
  • sign:分割字符串的分割符,也可以使用正则表达式。

  • limit:限制的分割次数。

【例10.12】按要求分割“192.168.0.1”(实例位置:资源包\TM\sl\10\12)

在项目中创建 Division 类,在主方法中创建一个值为 “192.168.0.1” 的 String 型变量,先按照 “.” 分割字符串,再按照 “.” 对这个字符串进行两次分割。实例代码如下:

public class Division {
	public static void main(String[] args) {
		// 创建字符串
		String str = "192.168.0.1";
		// 按照“.”进行分割,使用转义字符“\\.”
		String[] firstArray = str.split("\\.");
		// 按照“.”进行两次分割,使用转义字符“\\.”
		String[] secondArray = str.split("\\.", 2);
		// 输出str原值
		System.out.println("str的原值为:[" + str + "]");
		// 输出全部分割的结果
		System.out.print("全部分割的结果:");
		for (String a : firstArray) {
			System.out.print("[" + a + "]");
		}
		System.out.println();// 换行
		// 输出分割两次的结果
		System.out.print("分割两次的结果:");
		for (String a : secondArray) {
			System.out.print("[" + a + "]");
		}
		System.out.println();
	}
}

运行结果如图10.17所示。

image 2024 03 01 14 47 48 871
Figure 10. 图10.17 例10.12的运行结果

编程训练(答案位置:资源包\TM\sl\10\编程训练)

【训练7】截取QQ号 截取任意QQ邮箱地址中的QQ号。

【训练8】模拟员工打卡 公司有“张三”“李四”“王五”“赵六”“周七”“王哲”“白浩”“贾蓉”“慕容阿三”“黄蓉”10名员工,请模拟员工打卡:员工输入自己的名字,如果名单中有该员工,则提示“签到成功”,否则提示员工不存在。