Java巩固复习(4)-字符串

156 阅读4分钟

「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

这次再来复习一些Java的关于字符串的知识,主要包括子串、拼接、不可变字符串等知识。从概念上讲, Java字符串就是Unicode字符序列。例如,字符串“Java\u2122” 由5个Unicode 字符 J、a、v、a 和™组成。Java没有内置的字符串类型,而是在标准 Java 类库中提供了一个预定义类叫做String。每个用双引号括起来的字符串都是String类的一个实例:String e = "";表示一个空的字符串,String s = "Hello";表示一个变量名为s,值为Hello的字符串。

1.子串

String类的substring方法可以从一个较大的字符串提取出一个子串。例如:

String g = "Hello"; 
String s = g.substring(0, 3); //创建了一个由字符“Hel”组成的字符串。

substring方法的二个参数是截取字符串的起始和终止位置,但要注意这个区间是左闭右,这里要截取的位置为0、1和2这几个位置的字符。在substring中从0开始计数,直到3为止,但不包含3。substring的工作方式有一个优点:容易计算子串的长度。也就是第二个参数减去第一个参数。

2.拼接

和C、C++程序设计语言一样,Java语言允许使用 + 号连接(拼接)两个字符串。

String e = "Expletive"; 
String d = "Deleted"; 
String message = e + d; 

上述代码将“Expletivedeleted”赋给变量message(注意,单词之间没有空格,+号按照给定的次序将两个字符串拼接起来)。当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。例如:

int age = 13; 
String rating = "PC" + age; //rating 设置为“ PG13”

这种特性通常用在输出语句中。例如:System.out.println("The answer is "+answer); 这是一条合法的语句,并且将会打印出所希望的结果(因为单词is后面加了一个空格,输出时也会加上这个空格)。如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态 join 方法:

String all = String.join("/","S","M","L","XL");//all的结果就是"S/M/L/XL"

3.不可变字符串

String类没有提供用于修改字符串的方法,如果希望将字符串的内容修改为“Help!”,不能直接在原字符串进行修改,那么如何修改这个字符串呢?在Java中实现这项操作非常容易,首先提取需要的字符,然后再拼接上替换的字符串:greeting = greeting.substring(0, 3) + "p!"; 上面这条语句将greeting当前值修改为“Help!”。由于不能修改 Java 字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如同数字1永远是数字1一样,字符串“Hello” 永远包含字符 H、e、l、l和o的代码单元序列,而不能修改其中的任何一个字符。当然,可以修改字符串变量 greeting,让它指向另外一个字符串,这就如同可以将存放1的数值变量改成存放2一样。但是这样做是否会降低运行效率呢?看起来好像修改一个变量要比创建一个新字符串更加高效。其实,通过拼接“Hel”和“p!”来创建一个新字符串的效率确实不高。但是,不可变字符串却有一个优点:编译器可以让字符串共享。为了弄清具体的工作方式,可以看成将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。Java的设计者认为共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。查看一下程序会发现:很少需要修改字符串,而是往往需要对字符串进行比较,要修改字符串的话可以用StringBuffer和StringBuider。