String类的常见操作
String类在实际开发中的应用非常广泛,因此灵活地使用String类是非常重要的,接下来讲解一下String类常用的一些方法,如表1所示。
表1 String类的常用方法
方法声明 | 功能描述 |
---|---|
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引 |
int lastIndexOf(int ch) | 返回指定字符在此字符串中最后一次出现处的索引 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引 |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最后一次出现处的索引 |
char charAt(int index) | 返回字符串中index位置上的字符,其中index的取值范围是:0~(字符串长度-1) |
boolean endsWith(String suffix) | 判断此字符串是否以指定的字符串结尾 |
int length() | 返回此字符串的长度 |
boolean equals(Object anObject) | 将此字符串与指定的字符串比较 |
boolean isEmpty() | 当且仅当字符串长度为0时返回true |
boolean startsWith(String prefix) | 判断此字符串是否以指定的字符串开始 |
boolean contains(CharSequence cs) | 判断此字符串中是否包含指定的字符序列 |
String toLowerCase() | 使用默认语言环境的规则将String中的所有字符都转换为小写 |
String toUpperCase() | 使用默认语言环境的规则将String中的所有字符都转换为大写 |
static String valueOf(int i) | 返回 int 参数的字符串表示形式 |
char[] toCharArray() | 将此字符串转换为一个字符数组 |
String replace(CharSequence oldstr, CharSequence newstr) | 返回一个新的字符串,它是通过用newstr替换此字符串中出现的所有oldstr得到的 |
String[] split(String regex) | 根据参数regex(regex是一个正则表达式,用来限定分隔规则)将字符串分割为若干个子字符串 |
String substring(int beginIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直到此字符串末尾的所有字符 |
String substring(int beginIndex, int endIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直到索引endIndex-1角标处的所有字符 |
String trim() | 返回一个新字符串,它去除了原字符串首尾的空格 |
在表1中,列出了String类常用的方法,为了让读者更加熟悉这些方法的作用,接下来通过几个案例来具体学习一下String类中常用方法的使用。
1.字符串的基本操作
在程序中,需要对字符串进行一些基本操作,如获得字符串长度、获得指定位置的字符等。String类针对每一个操作都提供了对应的方法,接下来通过一个案例来学习这些方法的使用,如文件1所示。
文件1 Example02.java
1 public class Example02 {
2 public static void main(String[] args) {
3 String s = "abcabcbacdba"; // 初始化字符串
4 System.out.println("字符串的长度为:" + s.length());
5 System.out.println("字符串中第一个字符:" + s.charAt(0));
6 System.out.println("字符c第一次出现的位置:" + s.indexOf('c'));
7 System.out.println("字符c最后一次出现的位置:" + s.lastIndexOf('c'));
8 System.out.println("子字符串第一次出现的位置:" + s.indexOf("ab"));
9 System.out.println("子字符串最后一次出现的位置:"
10 + s.lastIndexOf("ab"));
11 }
12 }
运行结果如图1所示。
图1 运行结果
从图1可以看出,String类提供的方法可以很方便地获取字符串的长度,获取指定位置的字符以及指定字符和字符串的位置。
2.字符串的转换操作
程序开发中,经常需要对字符串进行转换操作,例如将字符串转换成字符数组、将字符串中的字符进行大小写转换等。接下来通过一个案例来演示字符串的转换操作,如文件2所示。
文件2 Example03.java
1 public class Example03 {
2 public static void main(String[] args) {
3 String str = "java";
4 char[] charArray = str.toCharArray(); // 字符串转换为字符数组
5 System.out.print("将字符串转为字符数组后的遍历结果:");
6 for (int i = 0; i < charArray.length; i++) {
7 if (i != charArray.length - 1) {
8 // 如果不是数组的最后一个元素,在元素后面加逗号
9 System.out.print(charArray[i] + ",");
10 } else {
11 // 数组的最后一个元素后面不加逗号
12 System.out.println(charArray[i]);
13 }
14 }
15 System.out.println("将int值转换为String类型之后的结果:"
16 + String.valueOf(12));
17 System.out.println("将字符串转换成大写之后的结果:"
18 + str.toUpperCase());
19 }
20 }
运行结果如图2所示。
图2 运行结果
在文件2中,使用String类的toCharArray()方法将一个字符串转为一个字符数组,静态方法valueOf()将一个int类型的整数转为字符串,toUpperCase()方法将字符串中的字符都转为大写。其中valueOf()方法有很多重载的形式,float、double、char等其他基本类型的数据都可以通过该方法转为String字符串类型。
3.字符串的替换和去除空格操作
在开发程序的过程中,需要考虑到用户输入数据时会有一些错误和空格的情况,这时可以使用String类的replace()和trim()方法,进行字符串的替换和去除空格操作。接下来通过一个案例来学习这两个方法的使用,如文件3所示。
文件3 Example04.java
1 public class Example04 {
2 public static void main(String[] args) {
3 String s = " http :// localhost : 8080 ";
4 // 字符串去除空格操作
5 System.out.println("去除字符串两端空格后的结果:" + s.trim());
6 // 字符串替换操作
7 System.out.println("去除字符串中所有空格后的结果:"
8 + s.replace(" ", ""));
9 }
10 }
运行结果如图3所示。
图3 运行结果
在文件3中,调用了String类的两个方法,其中trim()方法用于去除字符串中首尾的空格,replace()方法用于将字符串中所有与指定字符串匹配的子串替换成另一个字符串。
需要注意的是,trim()方法只能去除两端的空格,不能去除中间的空格。若想去除字符串中间的空格,则可以通过String类的replace()方法来实现。
4.字符串的判断操作
操作字符串时,经常需要对字符串进行一些判断,如判断字符串是否以指定的字符串开始、结束,是否包含指定的字符串,字符串是否为空等。在String类中针对字符串的判断操作提供了很多方法,接下来通过一个案例来学习这些判断方法的使用,如文件4所示。
文件4 Example05.java
1 public class Example05 {
2 public static void main(String[] args) {
3 String s1 = " Starter"; // 声明一个字符串
4 String s2 = "St";
5 System.out.println("判断是否以字符串St开头:" + s1.startsWith("St"));
6 System.out.println("判断是否以字符串er结尾:" + s1.endsWith("er"));
7 System.out.println("判断是否包含字符串ar:" + s1.contains("ar"));
8 System.out.println("判断字符串是否为空:" + s1.isEmpty());
9 System.out.println("判断两个字符串是否相等" + s1.equals(s2));
10 }
11 }
运行结果如图4所示。
图4 运行结果
在文件4中涉及到的方法都是用于判断字符串的,并且返回值均为boolean类型。在所使用的方法中,equals()方法是比较重要的,在String类中重写了父类Object中的equals()方法。
在程序中可以通过“==”和equals()两种方式对字符串进行比较,但这两种方式有显著的区别。equals()方法用于比较两个字符串中的字符值是否相等,“==”方式用于比较两个字符串对象的内存地址是否相同。对于两个字符串对象,当它们的字符值完全相同时,使用equals判断结果会为true,但使用“==”判断时,结果一定为false。为了便于理解,下面给出示例代码:
String str1 = new String("abc");
String str2 = new String("abc");
// 结果为false,因为str1和str2是两个对象
System.out.println(str1 == str2);
// 结果为true,因为str1和str2字符内容相同
System.out.println(str1.equals(str2));
5.字符串的截取和分割
在String类中针对字符串的截取和分割操作提供了两个方法,其中,substring()方法用于截取字符串的一部分,split()方法可以将字符串按照某个字符进行分割。接下来通过一个案例来学习这两个方法的使用,如文件5所示。
文件5 Example06.java
1 public class Example06 {
2 public static void main(String[] args) {
3 String str = "2018-01-24";
4 // 下面是字符串截取操作
5 System.out.println("从第6个字符截取到末尾的结果:"
6 + str.substring(5));
7 System.out.println("从第6个字符截取到第7个字符的结果:"
8 +str.substring(5, 7));
9 // 下面是字符串分割操作
10 System.out.print("分割后的字符串数组中的元素依次为:");
11 // 通过横线连接符“—”将字符串转换为字符串数组
12 String[] strArray = str.split("-");
13 // 循环输出数组中的元素
14 for (int i = 0; i < strArray.length; i++) {
15 if (i != strArray.length - 1) {
16 // 如果不是数组的最后一个元素,在元素后面加顿号
17 System.out.print(strArray[i] + "、");
18 } else {
19 // 数组的最后一个元素后面不加顿号
20 System.out.println(strArray[i]);
21 }
22 }
23 }
24 }
运行结果如图5所示。
图5 运行结果
在文件5中,调用了String类中重载的两个substring()方法,在第6行代码调用substring(5)方法时,因为字符串中的字符索引是从0开始的,所以会截取字符串中第6个字符以及之后的所有字符;第8行代码调用substring(5,7)方法时,会截取第6个和第7个字符。文件中的第12~22行代码演示了split()方法的用法,该方法会根据指定的符号“-”将字符串分割成了三部分,并存放到一个String类型的数组当中。使用for循环遍历数组即可按照要求输出所需内容,这里将各个日期之间使用顿号分隔。
脚下留心:
String字符串在获取某个字符时,会用到字符的索引,当访问字符串中的字符时,如果字符的索引不存在,则会发生StringIndexOutOfBoundsException(字符串角标越界异常)。
接下来通过一个案例来演示这种异常,如文件6所示。
文件6 Example07.java
1 public class Example07 {
2 public static void main(String[] args) {
3 String s = "abcde";
4 System.out.println(s.charAt(10));
5 }
6 }
运行结果如图6所示。
图6 运行结果
从图6可以看出,访问字符串中的字符时,不能超出字符的索引范围,否则会出现异常,这与数组中的角标越界异常相似。