首页 > 代码库 > [think in java]第13章 字符串

[think in java]第13章 字符串

不可变String

String对象是不可变的。String类中没一个看起来会修改String值的方法,实际上是创建了一个全新的String对象。


重载 “+”与StringBuilder

java为String对象重载了“+”操作符。如:String test = "abc" + "def" + "gh"; 根据上面我们提到的,String是不可变的,java会先生成一个String对象来链接“abc”和“def”,然后在创建一个String来链接刚才产生的string和“gh”生成最终的String。这种方式会产生一大堆需要垃圾回收的中间对象。但是java编译器会帮你优化代码,编译器会创建一个StringBuilder对象,利用append()方法将三部分内容加入进来,然后调用toString()方法产生最终的String对象。你也可以利用JDK自带的工具javap 来反编译以上代码。命令如下:

javap -c test
-c表示生成JVM字节码。但是编译器优化程度也是有限的。

public class UsingStringBuilder{
	pulblic static Random rand = new Random(47);
	public String toString(){
		StringBuilder result = new StringBuilder("[");
		for(int i = 0; i < 25; i++){
			result.append(rand.nextInt(100));
			result.append(",");
		}
		result.delete(result.length()-2, result.length());
		result.append("]");
		return result.toString();
	}
}

如上面的例子,如果将循环内的两个append合并,append(rand.nextInt(100)+","), 那么编译器就会掉入陷阱,从而为你另外创建一个StringBuilder对象处理括号内的字符串。频繁的创建StringBuilder也会造成很大开销。建议,如果要在循环中使用String的连接操作,最好自己创建一个StringBuilder对象。

StringBuilder是java SE5引入的,在这之前是用StringBuffer.StringBuffer是线程安全的,因此开销也会大。所以没有线程的问题时,建议用StringBuilder。


格式化输出

java SE5引入的format方法可用于PrintStream或对象,当然也可以用于system.out对象。format方法模仿自C的printf().

Fommatter类

在java中,所有新的格式化功能由java.util.Formatter类处理。格式化语法如下:

%[argument_index$][flags][width][.precision]conversion

width用来控制域的最小尺寸。“-”flag用来表示对其方向,默认为数据右对齐,加“-”是左对齐。.precision对于浮点数是指小数点后位数,对于整数则会触发异常。

常用类型转换

d           整数型(十进制)            e           浮点数
c            Unicode字符             x            整数(十六进制)
b            Boolean值                h            散列码(十六进制)
s             String                       f              浮点数(十进制)
注意:用到的b转换,对于boolean或Boolean型对象,转换结果是对应的true或false。但是对于其他类型,只要不是null,转换结果都为true,即使是数字0!这与我们所想的不一样,与C语言不同。


String.format()

String.format()是一个静态方法,它接受与Formatter.format方法一样的参数,但返回一个String。其实在String.format()方法内部,也是创建了一个Formatter对象。


正则表达式

String.match() 检查一个字符串是否匹配正则表达式。

String类有一个自带了正则表达式的工具split()方法,其功能是“将字符串从正则表达式匹配的地方切开”。String.split()还有一个重载版本,它允许你限制字符串分割的次数。

String.replace是String类最后一个正则表达式工具。

想了解正则表达式的相关语法和元字符,可以参考这篇文章,写的非常好。《正则表达式30分钟入门教程》 。具体的语言的正则表达式在实现上可能会有些许差别,但大体是一致的。

[think in java]第13章 字符串