StringBuilder下面这句一共创建了几个对象,分别是那几个

来源:8-5 线程的状态

慕容6015769

2019-09-09

老师,下面这里一共创建了几个对象,分别是那几个,对应用string+来做又有几个对象?今天面试被问到,没答上,StringBuilder("a").appent("b").appent("b").toString();

写回答

2回答

翔仔

2019-09-10

同学好,我觉得面试官问这种问题估计是有刁难的成分在里面,因为这主要取决于不同版本的jvm的实现,这里StringBuilder至少会创建四个对象,常量池里的"a","b" 以及堆中的StringBuilder对象、"abb"

这里为什么说至少,因为不同版本的jvm实现不同,这个模块比较复杂,我估计面试官也没弄清楚

如果换成是+即 "a"+"b"+"b"的话,如果先前常量池里没有"abb"则会创建一个对象。

PS:咱们当今的机器以及内存,多创建和少创建一个对象对性能的影响几乎可以忽略不计,那么问这种个问题究竟意义何在,因为也没有统一的标准答案,需要结合字节码还有实际运行的情况来看,主要是考察对象的生成的化可以有很多种方式去考察。。

1
1
慕容6015769
非常感谢!
2019-09-10
共1条回复

慕雪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());
    }

我也是新手,我说说自己的理解,不当之处请指出:

  1. 先写一个不恰的当程序来理解一下。因为StringBuilder和String都重写了Object的toString方法,我们这里在写一下的Object toString方法,然后给上面String和StringBuilder调用。这里简单把对象的hasCode等同于各自的对象地址吧,运行一下程序可以发现,用StringBuilder append的只有一个对象地址,而String 出来的对象地址每次都不同。

  2. 简单分析一下:由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; 内部是用一个普通的数组存储的,内容可变。

1
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8426 学习 · 1870 问题

查看课程