
6.1 String类
代码中,每个字符串都是String类的实例,可以通过String类的成员进行一系列的操作。下面介绍一些关于字符串的常见操作。
6.1.1 字符串的运算与比较
字符串的运算,最常见的就是通过+运算符来连接多个字符,如下面的代码所示。

比较两个字符串内容是否相同时,可以使用String对象的equals()方法,如下面的代码所示。

比较两个字符串时,会区分字母的大小写。如果需要忽略大小写,可以将字符串统一转换为大写或小写后再进行比较。
6.1.2 常用方法
字符串中的字符序列,可以使用从0开始的索引来访问,第一个字符的索引为0,第二个字符的索引为1,以此类推。获取字符串中指定位置的字符时,可以使用charAt()方法,如下面的代码所示。

indexOf()方法在字符串中查找指定的内容,如果找到则返回第一次出现的索引值,如果没有找到则返回-1,如下面的代码所示。

相关的方法是lastIndexOf()方法,它返回指定内容最后一次出现的索引值,如下面的代码所示。

需要截取字符串内容时,可以使用substring()方法,如下面的代码所示。

示例中,请注意substring()方法的参数使用,第一个参数指定开始截取的索引位置,当不指定第二个参数时,会从指定位置截取全部内容。第二个参数指定截取内容结束位置的后一个索引值,换一个方式说,当使用substring(i, n)方法截断字符串内容时,会截取从索引i开始的n-i个字符。
分隔字符串时使用split()方法,如下面的代码所示。

代码执行结果如图6-1所示。
split()方法中,参数指定分隔内容,可以是字符串,也可以使用正则表达式内容,方法会返回分隔后的字符串数组。第8章会详细讨论数组和集合的应用,本章稍后会有关于正则表达式的讨论。
此外,split()方法还可以使用第2个参数,其功能是指定分隔的成员数量,如下面的代码所示。

代码执行结果如图6-2所示。

图6-1 分隔字符串

图6-2 分隔指定数量的字符串
当判断字符串是否以指定内容开始时(字符串前缀),使用startsWith()方法,如下面的代码所示。

相应地,当判断字符串是否以指定内容(后缀)结束时,使用endsWith()方法。
trim()方法用于删除字符串开始位置和结束位置的空白字符(如空格等),并返回新的字符串对象。
toUpperCase()方法将字符串中的字母全部转换为大写,并返回新的字符串对象。
toLowerCase()方法将字符串中的字母全部转换为小写,并返回新的字符串对象。
valueOf()方法有多个重载版本,用于将不同类型的数据转换为String类型。
format()方法的功能比较强大,可以将多种不同类型的数据组合为字符串。方法中,第一个参数为主内容字符串,其中可以包含一系列不同类型数据的占位符,从第二个参数开始的数据则需要一一对应这些占位符。其中,常用的占位符有以下几个。
□ %b,显示布尔数据。
□ %d,显示整数。
□ %x,显示十六进制数。
□ %o,显示八进制数。
□ %f,显示浮点数,可以指定小数位数量,如%.2f指定显示两位小数。
□ %s,显示字符串。
下面的代码演示了format()方法的使用。
public static void main(String[] args) { String name = "Tom"; int age = 16; double height = 1.78; String s = String.format("%s今年%d岁,身高%.2f米",name,age,height); System.out.println(s); }
代码执行结果如图6-3所示。

图6-3 格式化字符串
6.1.3 将字符串转换为其他类型
要把字符串转换为基本数据类型的包装对象,可以使用这些包装类中定义的parseXXX()方法,如下面的代码所示。
public static void main(String[] args) { String s = "123"; System.out.println(Integer.parseInt(s)); System.out.println(Float.parseFloat(s)); }
代码执行结果如图6-4所示。
需要说明的是,如果字符串的内容不能正确地转换为目标类型,就会产生异常,如下面的代码所示。

图6-4 把字符串转换为基本数据类型
public static void main(String[] args) { String s = "ddd"; int x = Integer.parseInt(s); // 错误 System.out.println(x); }
实际应用中,若要无异常地获取目标类型数据,可以封装自己的转换代码。接下来,在CC类中封装一些常用的方法,如下面的代码(CC.java文件)所示。

实际应用中,可以通过类似下面的代码使用这些方法。
public static void main(String[] args) { String s1 = "ddd"; String s2 = "12.3"; System.out.println(CC.toInt(s1)); System.out.println(CC.toInt(s2)); System.out.println(CC.toDbl(s2)); }
代码执行结果如图6-5所示。
代码中,如果字符串的内容不能成功转换为目标类型数据,就会返回目标类型的默认值,这样可以保证任何情况下都有一个可用的值。当然,也可以在项目中根据实际情况进行处理。

图6-5 封装类型转换方法