空字符串
- 类型: "" 是一个空字符串,长度为0,在内存中分配一个空间,可以使用 Object 对象中的方法。例如
"".toString()
等 - 内存分配:
Stirng str = ""
:表明声明一个字符串类型的引用,其值""
为空字符串,这个 str 引用指向的是空字符串 "" 的内存空间
null
- 类型:null 表明一个对象的值,不是一个字符串,并没有分配内存,比如
String str = null
- 内存分配:
String str = null
:表明声明一个字符串对象的引用,但其指向一个null,也就是说没有指向任何内存空间
String str1 = "" // str对应一个空串,声明对象的引用String str2 = null // str2引用为空String str3 = new String() //str3指向具体的String实例, 默认为""**注意**:str1和str3都被实例化,都指向了内存中的空间,虽然str1和str2指向的地址不一样,但是值是一样的,都是"",而str2没有被实例化复制代码
比较
由于 null 不是对象,"" 是对象,所以比较的方式是
str1.equals("") //对象用equals方法来比较str2 == null //null用==来比较复制代码
总结
- Java中有两种比较大小的方式:
==
和equals
方法,前者是根据地址来比较,只有地址和值都相等,则两者才相等;后者则是根据变量的值比较大小,只要值相等,两者便相等。 - 在Java中变量和变量引用都是存在栈 (stack) 中,而对象 (new出来的)都是存放在堆 (heap) 中的,例如:
String a = new Stirng("ABC") //a存放在栈中,而ABC这个值存放在堆中,a指向ABC在堆中的地址