java和内存管理中的对象生命周期?

sai*_*ran 10 java string object heap-memory

对于程序中的以下语句,将在堆内存和字符串常量池中创建多少个对象?

我需要明确对象创建.我读过的许多资料都没有详细说明.当对象被破坏时我很困惑.

String a="MAM"+"BCD"+"EFG"+"GFE";
Run Code Online (Sandbox Code Playgroud)

将创建多少个对象?

我正在寻找有关对象,方法和类的生命周期的良好材料,以及JVM在动态更改和修改时如何处理它们.

Evg*_*eev 20

"MAM"+"BCD"+"EFG"+"GFE"是一个编译时常量表达式,它编译成"MAMBCDEFGGFE"字符串文字.String在加载包含上述代码的类时,JVM将从此文字创建一个实例,并将其String放入字符串池中.因此String a = "MAM"+"BCD"+"EFG"+"GFE";不会创建任何对象,请参阅JLS15.18.1. String Concatenation Operator +

除非表达式是编译时常量表达式(第15.28节),否则将新创建String对象(第12.5节).

它只是将String池中对象的引用分配给local var a.


Siv*_*y G 6

只创建一个对象.

string s1 = "java";
string s2 = "ja" + "va";
s.o.p(s1==s2);
Run Code Online (Sandbox Code Playgroud)

该陈述产生了真实.

String s1="java";
string s2 = "ja";
String s3 = s2 +"va";
s.o.p(s1==s3);
Run Code Online (Sandbox Code Playgroud)

该陈述产生错误.

因此,最小的一个明显应该是永久的,然后'+'运算符生成新的字符串对象(在非常量池中使用new()).所以,你提出的问题并不是永久性的.这意味着它只创建一个对象.


Jon*_*oni 3

只会创建一个对象并将其放入常量池中,除非该对象已经存在,在这种情况下将使用现有对象。编译器将字符串常量连接在一起,如 JLS 3.10.5 和 15.28 中所指定。

长字符串文字始终可以分解为较短的片段,并使用字符串连接运算符 + 编写为(可能带括号的)表达式

http://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.5