问题一: null和""的区别 String s = null; string.trim()就会抛出为空的exception String s = ""; string.trim()就不会抛,为什么? |
① null代表声明了一个空对象,根本就不是一个字符串。
""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。
② null代表声明了一个空对象,对空对象做任何操作都不行的,除了=和==。
""是一个字符串了,只是这个字符串里面没有内容了。
③ String s = null;只是定义了一个句柄,也就是说你有了个引用,但是这个引用未指向任何内存空间。
String s = "";这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它操作,而不用担心什么了。
总之:
String s=null;//null是未分配堆内存空间
String a;//分配了一个内存空间,没存入任何对象
String a="";//分配了一个内存空间,存了一个字符串对象
问题二: String s; 和 String s=null; 和 String s="a";有什么区别? 针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输出null.第三个则会输出a. 这是为什么呢?这三句声明语句,各自作了什么呢? |
① 第一个是没有初始化的引用;
第二个为空引用;
第三个是在字符串池里写入一个字符'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;只是给s分配一个内存空间
String s=null;是分配的空间中存储的值为空值
String s="a";这句就不用我多说了分配的空间的值为字符a
问题三: 声明了一个string a;变量 在以后的判断中,a == ""和a == null有何不同? |
① 如果没有给a赋过值,a==""会导致异常。
在实际处理时,往往认为""和null代表相同的含义,即都代表无值。
此时建议用如下语法:
if(a==null || a==""){ }
如果a为null,就不会执行后面的判断,直接返回true。
② null是用来判断引用类型是否分配了存储空间
""是针对字符串的;
string类型实际上是字符串指针,也即是一个引用类型
所以如果没有给a赋过值,a == ""会导致异常
所以if(a=="" || a==null){}这种写法也是正确的