首页 > 代码库 > null和“”

null和“”

看了些网上的资料,自己整理了一下,做一个总结。

java中的null和""的区别:

String str1=null;//str引用为空;它不是对象

String str2="";//str引用一个空串;

null代表了声明了一个空的,只是一个代号,根本就不是一个字符串,未指向任何内存空间

""代表声明了一个实例对象,这个对象实例的值是一个长度为0的空字符串。

null可以赋值给任何对象,但是""不行


String a; 声明一个string类型的 a,即没有在申请内存地址,更没有在内存任何指向引用地址;
String a = null ; 声明一个string类型的a同时在内存里申请了一个地址,但是该地址不指向任何引用地址; 创建一个空字符串对象;

String a ="" ;声明一个string类型的a,既在内存里申请了地址,该地址又指向一个引用该字符串的引用地址;


   String str=null;

   这时候str其实是指向一个内存的(null),当我们再次为str初始化(new一个新对象时),就是让str由指向null变成指向了new出来的新对象,这时候str才是真正的被初始化。

    

    String a;只是定义了一个String类型变量a,并没有给它赋初值,在Java中,默认在使用一个变量的时候必须赋予它初值(降低风险)。   

String s;//s为一个引用 

String s="a";和String s=new String("a");

在栈分配内存   在堆上分配


 1) String   abc=null;  
 2) String   abc;    
 3)String   a="";  
 4) String   b="";  
 5) String   c=new String("");  
 6) String   d=new String("");
 //1)等于2),和C语言不同,JAVA为安全原因不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为NULL,以防止访问到任意内存  
 //3)和4)中,变量a和b将会指向同一内存地址(""的地址)  
 //5)和6)中,变量c和d不会指向同一地址,而是两个""内容的地址,并且和a,b不同,实际上,3)和4)相当于new String("").intern().  
 //String类维护着一个字符串池,对于像3)和4)这样的赋值方法,String会在这个池中查找字符串是否已经在池中,如果在,就直接指向该地址,如果不在,生成一个实例放入池中再指向那个地址,可见对于同样内容的字符串多次引用时3)4)的方法要比5)6)的方法剩内存,之所以这样做,是 因为String是一个内容不可变的量


在成员变量的定义中,String s;等同于String s=null;

而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。

只要是在方法在中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器回自动赋初值。

null和“”