通过JVM了解String

86 阅读1分钟

首先我们来看一个看似简单的String问题,如下这个片段中的1,2,3行分别会输出什么

String a = "1234";
String b = "1234";
String c = "12";
String d = c + "34";
String e = "12" + "34";
System.out.print(a == b);  //1
System.out.print(a == d);  //2
System.out.print(a == e);  //3

要想知道这个问题的答案,我们首先需要了解String在JVM中是如何创建的

栈用于存放局部变量表、操作栈、动态链接、方法出口等信息。
堆用于存放java对象。
字符串常量池在堆中。
每当我们创建字符串常量的时候,JVM就会在字符串常量池中检查是否已存在该字符串,若存在则直接将此对象在栈中的地址赋值给引用。若不存在则将新的字符串放入常量池中。
还有一点需要了解的是string的+符号背后是如何运行的:

  1. 如果是两个常量相加,则在编译期就将拼接后的常量得出;
  2. 如果是一个对象+常量,则在运行期通过StringBuilder的append方法拼接并返回一个新的对象。

所以开篇提到的问题正确答案应该是true, false, true