StringBuilder下面这句一共创建了几个对象,分别是那几个
来源:8-5 线程的状态
慕容6015769
2019-09-09
老师,下面这里一共创建了几个对象,分别是那几个,对应用string+来做又有几个对象?今天面试被问到,没答上,StringBuilder("a").appent("b").appent("b").toString();
2回答
-
同学好,我觉得面试官问这种问题估计是有刁难的成分在里面,因为这主要取决于不同版本的jvm的实现,这里StringBuilder至少会创建四个对象,常量池里的"a","b" 以及堆中的StringBuilder对象、"abb"
这里为什么说至少,因为不同版本的jvm实现不同,这个模块比较复杂,我估计面试官也没弄清楚
如果换成是+即 "a"+"b"+"b"的话,如果先前常量池里没有"abb"则会创建一个对象。
PS:咱们当今的机器以及内存,多创建和少创建一个对象对性能的影响几乎可以忽略不计,那么问这种个问题究竟意义何在,因为也没有统一的标准答案,需要结合字节码还有实际运行的情况来看,主要是考察对象的生成的化可以有很多种方式去考察。。
112019-09-10 -
慕雪0387062
2019-09-09
public class TestMain { public static void main(String[] args) { StringBuilder stringBuilder = new StringBuilder(); System.out.println(TestMain.toString(stringBuilder)); stringBuilder.append("a"); System.out.println(TestMain.toString(stringBuilder)); stringBuilder.append("b"); System.out.println(TestMain.toString(stringBuilder)); System.out.println("--------------------------------"); String aString = ""; System.out.println(TestMain.toString(aString)); aString += "a"; System.out.println(TestMain.toString(aString)); aString += "b"; System.out.println(TestMain.toString(aString)); } public static String toString(Object o) { return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); }
我也是新手,我说说自己的理解,不当之处请指出:
先写一个不恰的当程序来理解一下。因为StringBuilder和String都重写了Object的toString方法,我们这里在写一下的Object toString方法,然后给上面String和StringBuilder调用。这里简单把对象的hasCode等同于各自的对象地址吧,运行一下程序可以发现,用StringBuilder append的只有一个对象地址,而String 出来的对象地址每次都不同。
简单分析一下:由String源码可以发现
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[]; //String 内部是用一个不可变的char数组来存放字符串的,一旦赋值便不可变而StringBuilder继承自抽象类 AbstractStringBuilder,
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value; 内部是用一个普通的数组存储的,内容可变。
10
相似问题