标签(空格分隔): java
StringBuilder——字符串拼接多般是使用StringBuilder类,以及它的一系列的append方法。###
首先说一下String,StringBuilder,StringBuffer的区别:
- 字符串是不可变的,因为字符串都是常量!如果你试着改变它们的值,另一个对象被创建,而StringBuffer和StringBuilder是可变的,这样他们就可以改变它们的值
- StringBuffer是线程安全的。当应用程序只需要运行在单个线程则最好使用StringBuilder。StringBuilder比StringBuffer更有效率,因为StringBuffer其实是给StringBuilder加了同步锁;其实你使用Log.d(TAG,"xx"+"yy")这类写法后,编译器生成的代码已经自动帮你变成StringBuilder了
StringBuilder原理分析:###
将字符串拼接时(不管是字面常量也好,或者是变量,方法调用的结果也好),即用“+”将多个字符串拼接时,实际上都是变成StringBuilder。如果一个字符串(不管是字面常量也好,或者是变量,方法调用的结果也好)
new StringBuilder().append( string_exp ).append( any_exp ).toString()
如果表达式里有多个+号的话,后面相应也会多多几个StringBuilder.append的调用,最后才是toString方法。
StringBuilder(String)这个构造方法会分配一块16个字符的内存缓冲区。因此,如果后面拼接的字符不超过16的话,StringBuilder不需要再重新分配内存,不过如果超过16个字符的话StringBuilder会扩充自己的缓冲区。最后调用toString方法的时候,会拷贝StringBuilder里面的缓冲区,新生成一个String对象返回。
所以在在我们经常将一些基本数据类型转化成字符串时,例如经常是这样做的:String text=100+"";
虽然可以将整数100转化成“100”字符串,但是一个StringBuilder对象,一个char[16]数组,一个String对象,一个能把输入值存进去的char[]数组。这样是很浪费内存的,所以推荐使用String.valueOf,即String text=String.valueOf(100);
这样至少StringBuilder对象省掉了。
有的时候或许你根本就不需要转化基础类型。比如,你正在解析一个字符串,它是用单引号分隔开的。最初你可能是这么写的:
final int nextComma = str.indexOf("'");
或者是这样
final int nextComma = str.indexOf('\'');
String.concat——除非只拼接两个字符串,这个方法才会比较高效一些。###
它是字符串拼接另外一个方法,它内部其实是分配了一个char[],长度就是拼接后的字符串的长度,它将字符串的数据拷贝到里面,最后使用了私有的构造方法来生成了一个新的字符串,这个构造方法不会再对char[]进行拷贝,因此这个方法调用只创建了两个对象,一个是String本身,还有一个就是它内部的char[]。
- 同时,使用字符串进行逻辑运算是相当缓慢的,,不建议,因为JVM将字符串转换为字节码的StringBuffer。浪费大量的开销将从字符串转换为StringBuffer然后再返回字符串
综上所述:尽量使用StringBuilder,而不用String来累加字符串
总结
- 当转化成字符串的时候,应当避免使用""串进行转化。使用合适的String.valueOf方法或者包装类的toString(value)方法。
- 尽量使用StringBuilder进行字符串拼接。检查下老旧码,把那些能替换掉的StringBuffer也替换成它。
- 使用Java 6 update
20引入的-XX:+OptimizeStringConcat选项来提高字符串拼接的性能。在最近的Java7的版本中已经默认打开了,不过在Java
6_41还是关闭的。
StringBuffer类调用toString()方法后将转换为String类型
String类型中没有append()方法,要追加字符串”+“即可,也没有必要 append
可以直接将字符串“test”复制给声明的Stirng类的变量,而StringBuffer类的不行
String 实例 是不可变的
String 对象/实例 是不可以被改变的。
当new一个String对象时,JVM会在内存中创建一个String对象,当另外一个String对象值与它一样时,会将该对象直接指向对应的地址。
String a = "abc";
String b = "abc";
System.out.println(a == b);//true
网友评论