英文:String manipulation is arguably one of the most common activities in computer programming. ——摘自《Thinking in Java》
上面这句话是Bruce Eckel(作者,绝对的牛人),在《Java编程思想》书中开讲String时的第一句话。其实不只是java语言,在任何编程语言中,数据处理无外乎就是处理字符串和数字。而在Java中,对于字符串的处理很大最直接的就是String类(其他还有StringBuilder、StringBuffer类以及正则表达式的应用),最基础的也是String类,所以我们很有必要搞清楚Java中String的特性和实现机制。
String按照字面理解,就可知道代表一串字符。我总结了对字符串最多的操作,见下表。如有遗漏,请大家指正啊。
说明:在下表中,为了方便书写,方法的参数省略,参数的详细信息参考Java API。
获取信息操作 | ||
字符串长度 | length() | |
比较字符串引用 | “==” | |
比较字符串内容 | equals() 或 compareTo() | |
已知位置,找字符 | charAt() | |
已知字符(串),找位置 | indexOf() 或 lastIndexOf() | |
判断开头和结尾 | startWith() 或 endWith() | |
其他类型转换为字符串 | valueOf() | |
更改操作 | ||
连接字符串 | “+” 或者 concat() | |
替换子字符串 | replace() | |
获取子字符串 | subString() | |
分割字符串 | split() | |
更换大小写 | toUpperCase()、toLowerCase() | |
去除空白符 | trim() |
String是常量,我们常称其为不可变性,意思是一旦创建就不能更改。
所以对于上面的“更改操作”,返回值都是字符串,但并不是对源字符串进行更改,而是返回了新的字符串。下面有测试代码。
小实验:如果查看Java API文档中对String的方法的说明,会发现用了很多的“return a new String ”。
所谓String的不可变性,是说一旦字符串被创建,对其所做的任何修改都会生成新的字符串对象。
代码如下:
public static void main(String[] args) { String a = "abc"; String b = a.toUpperCase(); System.out.println("a: " + a); System.out.println("b: " + b); System.out.println("a==b: "+ (a==b)); //当a不发生变化时,不返回新字符串。 String c = a.toLowerCase(); System.out.println("c: " + c); System.out.println("a==c: "+ (a==c)); }
运行结果:
a: abc b: ABC a==b: false c: abc a==c: true
运行结果分析:
字符串a指向"abc",全为小写;字符串b由a得来,指向"ABC";这时a的内容并没有变化,也就证明了Java中String的不变性。
后面利用"a==b"来判断a,b是否指向同一个对象,返回值为false,也能证明String的不变性。
对于字符串c的例子说明如果a没有发生变化,那么不返回也不需要返回新字符串,所以"a==c"的返回值为true。