String str1;
String str2 = null;
String str3 = "";
String str4 = new String();
String str5 = new String("");
我知道上面第三个初始化的字符串对象是在字符串池中初始化的,而第四个则与字符串池无关。
1.和2.之间有什么区别?如果将str1
视为指针变量,则它存储的是JVM或操作系统从未使用过的特定内存地址吗?
4.和5.有区别吗?
当我通过System.out.println(str1)
和System.out.println(str2)
直接打印str1
和str2
时,对于str1
,我甚至不能通过编译。对于str2
,编译是可以的,而且我得到了"null"和控制台窗口中的输出。为什么?
在@aioobe的回答之后进行编辑:更多问题:
我想更多地了解"null"。由于str2
(引用变量)就像一个指针变量,因此它内部应该有一些(0/1位)东西(在这个指针变量所占用的内存中)。由于它被初始化为null,它是全0位还是null的字节码是全零?另一个问题是,如果我通过str2.toString()
调用toString()方法,我会在运行时得到一个NullPointer错误。那么JVM是检查引用变量是否为null吗?JVM如何知道它是null的?JVM检查str2
中的位吗?
关于Java中的null还有一个问题:连接null和字符串文字