String对象详解

84 阅读1分钟
public class Test {
    public static void main(String[] args) {
        String s = "xyz";
    }
}

从结果来看,ldc命令在常量池中创建了一个"xyz"的对象,然后把他推至操作数栈顶,然后astore保存到局部变量,return返回。

public class Test {
    public static void main(String[] args) {
        String s = new String("xyz");
    }
}

很明显,我们看到new 创建了一个String对象,同时ldc在常量池中创建了"xyz"字符串对象,之后invokespecial执行构造函数,astore_1赋值,return返回。

通过以上两个例子,可以知道String s = new String("xyz"); 创建了2个对象,而有些答案说的3个对象,则是把引用s也算作一个对象。

到底创建了几个对象呢?

  1. 如果xyz不存在,引用算对象的话,那就是3个
  2. 如果xyz不存在,引用不算对象的话,那就是2个
  3. 如果xyz存在,引用算对象的话,那就是2个
  4. 如果xyz存在,引用不算对象的话,那就是1个
public static void main(String[] args) {
    /*final*/ String str1 = "abc";
    /*final*/ String str2 = "def";
    String strRes1 = "abc" + "def"; // String strRes1 = "abcdef";
    String strRes2 = str1 + str2; // String strRes2 = new StringBuilder().append(str1).append(str2).toString();
    System.out.println(strRes1 + ":" + strRes2);
}

当某字符串等于两字符串常量相加时,java编译器会将其自动优化为两个字符串常量的和;而当某字符串等于两字符串变量相加时,java编译器不会进行优化。