java中的null和""区别------&&与&的区别

时间:2023-03-10 00:13:02
java中的null和""区别------&&与&的区别

java中的null和""区别------&&与&的区别

(1)问题一:
null和""的区别
String s=null;
string.trim()就会抛出为空的exception 
String s=""; 
string.trim()就不会抛,

为什么?

答:
NULL:代表声明了一个空对象,不是一个字符串,可以赋给任何对象。  
""     :代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。

String s=null;  只是定义了一个句柄,即你有了个引用,但是这个引用未指向任何内存空间 
String s="";    这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它操作。

(2)问题二:

String s1;             //分配了一个内存空间,没存入任何对象 

String s2=null;   //null是未分配堆内存空间

String s3="a";   //分配了一个内存空间,存了一个字符串对象

out.println(s1);  //   出现异常

out.println(s2);  //    输出null

out.println(s3);  //    输出“a”

答:

主要要理解的是String s; s为一个引用~~它不是对象 
第一个是没有初始化的引用; 
第二个为空引用;
第三个是在字符串池里写入一个字符'a',然后用s指向它。
另外, 
String s="a"和String s=new String("a");是有本质上的区别的 :

(1)
前者是在字符串池里写入一个字符'a',然后用s指向它;
后者是在堆上创建一个内容为"a"的字符串对象。

(2)
String str="aaa"; //于栈上分配内存
String str=new String("aaa"); //于堆上分配内存

(3)问题三:
String a;

if(a=="")  //编译阶段即异常

String a = null;

if(a==null)  //返回true

答:
在实际处理时,往往认为""和null代表相同的含义,即都代表无值。 
此时建议用如下语法: 
if(a==null || a=="") 
{
}

这就是为什么验证用户名是否为空的时候,先写null在前,然后在判断"".

username!=null && !username.equals("");

如果为null,表示连内存空间都没有,就不用判断是否有空字符串了。这个顺序是不能交换的,否则会出现空指针的异常。
如果a为null,就不会执行后面的判断,直接返回true。

null:是用来判断引用类型是否分配了存储空间 
""  :是针对字符串的; 

下面说下:&&与&的区别:

&运算符有两种用法:按位与,和逻辑与

&&运算符是短路运算:即如果&&左边的表达式的值为false,则右边不用判断,即直接右边的表达式被短路掉了,不进行运算了。

用法:很多时候我们用的最多的是&&短路与。

另外注意:或运算:|与||也是这个区别。||这个运算符即表示左边的表达式正确了,右边的就不用判断了。

(4)问题四:

String s;在什么情况下可以等同于String s=null;而在什么情况下又不等同?
考虑下面的代码:

java中的null和""区别------&&与&的区别
1 //StringTest.java
2 public class StringTest {
3
4 static String s;
5
6 public static void main(String[] args) {
7 System.out.println(s); //输出null
8 }
9 }
java中的null和""区别------&&与&的区别

编译并运行上面的代码,将打印null。
s是自动初始化了的(s被自动初始化为null)。 
由此得出结论:
在成员变量的定义中,String s;等同于String s=null;
而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。
还有一点要说明的是:
只要是在方法在中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器会自动赋初值。