本帖最后由 贾文泽 于 2013-2-26 22:17 编辑
张向辉 发表于 2013-2-26 21:46
当你发现你写的程序中 String s = a+b+c+d+e; 真正是创建了三个对象的时候
这句有点不懂,莫非真中邪了 ...
加分就会自动解咒的{:soso_e113:}
String s = a+b+c+d+e;
由于编译器的优化,最终代码为通过StringBuilder完成:- StringBuilder builder = new StringBuilder();
- builder.append(a);
- builder.append(b);
- builder.append(c);
- builder.append(d);
- builder.append(e);
- String s = builder.toString();
复制代码 StringBuilder的构造器是这样的- public StringBuilder() {
- super(16); //这里其实是 value =new char[capacity];
- }
复制代码 这样就分配了一个16个长度的数组(数组也是一个对象吧)
append里面使用了arraycopy的复制方式,也没有产生新的对象。再看StringBuilder的 toString()方法: - public String toString() {
- // Create a copy, don't share the array
- return new String(value, 0, count); //生成一个新的String ,算是一个对象吧
- }
复制代码 所以真正的是创建了3个对象,但是只有一个是String对象
1 StringBuilder
2 new char[capacity]
3 new String(value,0,count);
但是,如果超过了16个字节的长度,append里面就不再使用arraycopy了,而是Arrays,,,这样会再创建一个数组的
|