一、类型
null表示的是一个对象的值,而并不是一个字符串。例如声明一个对象的引用,String a = null ;
""表示的是一个空字符串,也就是说它的长度为0。例如声明一个字符串String str = "";
二、内存分配
Stringstr = null ; 表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;
String str =""; 表示声明一个字符串类型的引用,其值为""空字符串,这个str引用指向的是空字符串的内存空间;
""分配了内存,null没有,调用null的字符串的方法会抛空指针异常(NullPointerException)。
""是一个字符串(String),它在内存中是存在的,它可以使用Object对象中的方法(如"".toString();"".equals())而null它是一个空对象,在内存中是不存在的,它不可以使用Object对象中的方法。
""占内存,在内存中会分配一个空间。
null不占内存,为空引用。
在Java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap):
就如下:
String str = new String("abc") ;
ps:=左边的是存放在栈中(stack),=右边是存放在堆中(heap)。
三、"=="与".equal()"区别
"=="对两个字符串作比较时,比较的是内存地址是否相等。
".equal()"是对两个字符串对象的内容作比较,与地址无关。
比如以下代码:
publicclass String_Demo {
publicstatic void main(String[] args){
String str1 = new String() ;
String str2 = null ;
String str3 = "" ;
System.out.println(str1==str2); //内存地址的比较,返回false
System.out.println(str1.equals(str2)); //值的比较,返回false
System.out.println(str2==str3); //内存地址的比较,返回false
System.out.println(str3.equals(str2)); //值的比较,返回false
System.out.println(str1==str3); //内存地址的比较,返回false
System.out.println(str1.equals(str3)); //值的比较,返回true
}
}
综上,
- 字符串对象与null的值不相等,且内存地址也不相等;
- 空字符串对象与null的值不相等,且内存地址也不相等;
- 创建一个字符串对象的默认值为""