字符串内存分配

kak*_*aka 2 java

哪一个更好

System.out.println("hello world");
Run Code Online (Sandbox Code Playgroud)

要么

String s="hello world";
System.out.println(s);
Run Code Online (Sandbox Code Playgroud)

Luc*_*ero 9

对于这个简单的例子,在内存分配方面没有区别.


pol*_*nts 6

这种情况没有区别.

重要的是要意识到引用是如何工作的,并且局部变量与它们所引用的对象不同.局部变量本身所需的内存是微不足道的; 如果它使代码更具可读性,你应该毫不犹豫地声明局部变量.

考虑以下代码:

String s1 = "a very long string...";
String s2 = s1;
Run Code Online (Sandbox Code Playgroud)

此代码声明了两个String引用,但它们都引用了同一个String对象.在这种情况下,内存要求不会翻倍.

你永远不应该低估编译器在优化代码时的智能程度.请考虑以下示例:

System.out.println("Hello world!");
System.out.println("Hello world!");
System.out.println("Hello world!");
Run Code Online (Sandbox Code Playgroud)

事实上,上面的代码片段并没有将字符串对象存储"Hello world!"在内存中三次!文字是实习的,只存储在内存中一次.

参考

JLS 3.10.5字符串文字

每个字符串文字都是对实例的引用class String.String对象具有常量值.字符串文字 - 或者更一般地说,是作为常量表达式值的字符串 - 被"实例化"以便使用该方法共享唯一实例String.intern.

相关问题