Java String——字符串

1 String对象是不可变的(常量)

String对象具有只读特性,可以给一个String对象添加任意多的别名(也即引用),引用不能改变String对象本身的值。

不可变性,在字符串连接的操作过程中,会涉及到效率的问题。

如果单纯地使用Java重载的运算符“+”和“+=”,对字符串进行连接的操作,那么每一次连接之后都会新生成一个String对象,再获得最终连接结果之前会一直占据着内存空间,直到获得最终的字符串连接结果之后,中间生成的String对象都需要回收,影响回收的效率和资源。

所以,涉及到字符串连接的问题时,一般会采用StringBuilder的方式,生成一个StringBuilder对象,通过StringBuilder.append()方法,将需要连接的字符串全部连接到该StringBuilder对象上,最后输出的时候利用StringBuilder.toString()将StringBuilder对象转换成String对象即可。

使用StringBuilder创建一个StringBuilder对象,默认初始容量是16个字节,当然也可以自定义容量。只要加入的字符串长度没有超过StringBuilder的容量,就无需分配新的的内部缓冲区,否则StringBuilder的容量就会自动增大,即分配新的内部缓冲区。

2 String类的常用操作

对于String对象的操作,如果没有改变String对象的内容,那么只是生成了一个新的引用指向原字符串对象;若改变了String对象的内容,则会创建一个新的String对象。

方法 用法
length() 获取字符串长度
charAt(int i) 获取字符串相应位置的字符,范围是0~length()-1
equals(String s) 两个字符串比较是否相同,考虑大小写
equalsIgnoreCase(String s) 两个字符串比较是否相同,不考虑大小写
compareTo(String s) 两个字符串按照字典顺序比较大小,考虑大小写,实际上就是依次比较两个字符串对应位置商字符的ASCII码:调用对象字符的ASCII码 - 参数字符的ASCII码,最后返回一个数值(正数 负数 零)
subString(int s)/subString(int s,int e) 获取字符串的子串,范围是0~length()-1:(1)截取从s到字符串末尾的子串;(2)截取从s到(e-1)的子串
toUpperCase() 将字符串里的所有字符变成大写
toLowerCase() 将字符串里的所有字符变成小写
String.valueOf(xxx)/Number.valueOf(String s) (1)将xxx转换成String对象;(2)将String对象转换成特定的基本数据包装类的对象,比如Integer/Double/Byte等

3 格式化的输出方式

格式化风格的输出方式,便于在输出的时候控制字符之间的间距,将内容打印出表格形式的样子。

(1)C语言风格的printf()方法

由于C语言没有对字符串重载连接符“+”和“+=”,所以需要使用特殊的占位符——格式化说明符来表示将来需要填入数据的位置。

例如:printf("The match is between %s and %s, and the result is: %d : %d.\n", team1, team2, team1Score, team2Score)

其中,%x表示特定的类型数据,之后的变量将会按照顺序填入之前确定好的位置之中。

(2)System.out.format()方法

该方法可以用于PrintStream或者PrintWriter对象,与System.out.printf()的用法是一样的。

(3)Formatter类

java.util.Formatter类,当创建一个Formatter对象的时候,需要向Formatter的构造器传递参数,告诉最终的结果将会输出到哪里:new Formatter(System.out),这样在该类里,Formatter.format()方法的输出,将会自然而然地输出到System.out,就跟普通的打印到控制台一样。

经过重载的Formatter类的构造器可以接受多种输出目的地,常用的是System.out PrintStream OutputStream File 。

(4)格式化说明符

%[-] <距离> <类型转换字符> [%<距离> <类型转换字符>] ......\n

默认情况下,数据的输出是右对齐的,若要实现左对齐,需要在格式化说明符的最前面加上-标志。

类型转换字符

格式化说明符 = %<距离> <类型转换字符>

类型转换字符,可以将输入的参数转换成相应的类型数据,并输出。转换需要符合类型转换的规则

Formatter.format("%s\n",'d');,意思就是将字符d转换成字符串。

d 整数(十进制) c Unicode字符(其实就是char类型)
s String x 整数(十六进制)
b Boolean值 h 散列码(十六进制)
f 浮点数(十进制) % 字符 %
e 浮点数(科学计数) - -

String.format()是一个静态方法,使用方法和Formatter.format()一样,只不过输出的是String对象。

4 正则表达式与String类

正则表达式可以用于解决各种字符串处理相关的问题,包括匹配、选择、编辑以及验证等等。

关于正则表达式,将会有另一篇文章介绍。正则表达式

(1)String.split()

该方法将字符串从正则表达式匹配的地方,切分成前后字符串,以数组的方式返回结果。切分后的一般会使用Arrays.toString()方法转换为字符串:Arrays.toString(str.split(" "));

(2)String.replaceFirst()/String.replaceAll()

String.replaceFirst("regex","replaceWords"),只替换正则表达式匹配到的第一个子串。

String.replaceAll("regex","replaceWords"),会将正则表达式匹配到的所有子串都替换。

附:

1 关于运算符重载

用于字符串连接的“+”和“+=”是Java中仅有的两个重载过的操作符。

2 StringBuilder与StringBuffer

StringBuilder是线程不安全的,即一般在单线程使用字符缓冲区的时候使用,多线程的时候保证线程安全一般使用StringBuffer。但是,StringBuffer由于考虑到了线程安全,所以较StringBuilder要慢一点。

3 toString()方法

所有的容器类都覆写了toString()方法。

若想打印对象的内存地址,准确的应该是调用Object.toString(),即super.toString(),而不是当前类的this.toString()。(Object类是所有类的父类,包括容器类)

4 Java Doc

http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html