why null is allocated on java stack

提问:

恩。。。俺的意思是,
String str = null;
str = "String";
最后的"String"对象是建立在栈里的,而不是堆里的,这样一来,第一句话,仍然还是在堆中开辟空间么?因为最后的对象其实是在栈中,如果一开始声明null的时候,在堆中开辟空间,岂不是有点奇怪?

 

回答:

1. null不是一个对象,JLS 3.10.7 中提及的是The Null Literal,况且它是ASCII中值为0的一个字符
2. null instanceof Object 是false 也证明了它不是Object
3. null在JVM全局内存中只存在一个,因为它无需存在多个,造成不必要浪费,因此挺符合String interned的初衷。All literal strings and string-valued constant expressions are interned. 我觉得null勉强能算是literal string,因为它是基于字符的。

综上,既不是Object又够格interned,所以认为null是在栈中开辟。

 

http://norvig.com/java-iaq.html#null

http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf

http://topic.csdn.net/u/20111204/23/816f6ab6-e99c-48ad-84a0-03de4fd8aa4c.html?seed=797611320&r=78770770#r_78770770

你可能感兴趣的:(stack)