Java中null和“”的区别
null和空字符串('')虽然都是没有任何内容,但是null却输出空指针异常,因为堆内存中根本就没有这个东西。
他们的区别可相当大,虽然都是没有信息,但是null代表堆内存中根本没有这个东西,这个对象不存在,怎么执行indexof操作?空字符串虽然没有信息,但是是有内存空间的,所以null与空字符串主要区别如下:
1.类型
null表示的是一个对象的值,而非一个字符串。例如声明一个对象的引用,String aaa = null ;
""表示的是一个长度为0的空字符串。例如声明一个字符串String bbb = "" ;
所以:null不指向任何对象,相当于没有任何值;而""代表一个长度为0的字符串。
2.内存分配
String aaa = null ;
表示声明一个字符串对象的引用,但指向为null(未指向任何的内存空间);
String bbb = "";
表示声明一个字符串类型的引用,其值为""空字符串(指向空字符串的内存空间);
在java中变量和引用变量是存在栈中(stack),而对象(new产生的)都是存放在堆中(heap)。
所以:null不分配内存空间;而""会分配内存空间。
链接:https://www.jianshu.com/p/13d29444fbc5
拓展
String s;和String s=null;和String s="a";有什么区别?
针对这三种情况,使用out.println(s);的时候,第一个会出现异常(作为局部变量时,反正就是没有初始化时),第二个会输出null.第三个则会输出a。
这是为什么呢?这三句声明语句,各自作了什么呢?
答:
第一个只是定义了一个String类型变量s,并没有给它赋初值,在Java中,默认在使用一个变量的时候必须赋予它初值(降低风险)。
第二个和第三个都定义了String类型变量s,并赋予它初值,只不过第二个赋予的值为null(空)罢了
主要要理解的是String s; s为一个引用~~它不是对象
第一个是没有初始化的引用;
第二个为空引用;
第三个是在字符串池里写入一个字符'a',然后用s指向它。
另外,
String s="a"和String s=new String("a");是有本质上的区别的
前者是在字符串池里写入一个字符'a',然后用s指向它;
后者是在堆上创建一个内容为"a"的字符串对象。
String str="aaa"; //于栈上分配内存
String str=new String("aaa"); //于堆上分配内存
String s; 系统会自动赋值null
String s;
String s=null;是分配的空间中存储的值为空值
String s="a";这句就不用我多说了分配的空间的值为字符a