Java中的string
string类中的每个看起来会修改string的方法,实际上都是创建了一个新的string对象,用来存储修改后的字符串对象,但是最初的string对象没有改变
关于在string中使用“+”和stringbuilder()
String s="abc"+"def"+"mongo"+47;
反编译结果是,编译器创建一个stringbuilder对象,使用四次stringbuilder中的append()方法,最终调用tostring()方法产生最终的string对象。
但是有些情况下编译器并不是这样优化的。
public class print { public static void main(String[] args) { String string=""; for(int i=0;i<5;i++){ string=string+i; } System.out.println(string); } }
这种情况下编译器每经过一次循环都会产生一次StringBuilder对象导致资源浪费
推荐使用StringBuilder,将上面的String替换成StringBuilder,改写上面的代码成下面的形式
public class print { public static void main(String[] args) { StringBuilder stringBuilder=new StringBuilder(); for(int i=0;i<5;i++){ stringBuilder.append(i); } System.out.println(stringBuilder); } }
这样在编译的时候就只会产生一个stringbuilder。
注意使用str.append(a+":"+b)的时候,编译器并不会走捷径,对于括号里的内容,他会重新创建一个StringBuilder去处理。
如果在循环中对同一个string拼接使用stringbuilder,编写类的toString()方法时候注意
无意识的递归问题
在写类的toString方法时候应该注意,想要打印对象的内存地址时候容易出现
public class print { public String toString() { return "print"+this; } public static void main(String[] args) { System.out.println(new print()); } }
当执行"print"+this时候,还会调用toString方法,从而导致无限的递归调用。
应该讲上面的
"print"+this;
改成
"print"+super.toString();