null指的是一個空對象,這個對象可以是任何一個類的實例。
""指的是一個空字符串,這個字符串的長度為0。
也就是說null這個對象的類型可以是任何一個類型,而""這個對象的類型只能是String。
問題:java中空字符串和null的區別,如下題
String str1 = "";
String str2 = null;
String str3 = new String();
String str11 = "";
String str22 = null;
String str33 = new String();
System.out.println(str1 == str2); //false
System.out.println(str1 == str3); //false
System.out.println(str1 == str11); //true
System.out.println(str1.equals(str2)); //false
System.out.println(str1.equals(str3)); //true
System.out.println(str1.equals(str11)); //true
System.out.println(str2 == str3); //false
System.out.println(str2 == str22); //true
System.out.println(str2.equals(str22)); //報錯,str2為空,空指針異常
System.out.println(str2.equals(str3)); //str2在前報錯,改成如下格式
System.out.println(str3.equals(str2)); //false
System.out.println(str3 == str33); //false
System.out.println(str3.equals(str33)); //true
延伸問題:數據庫如下圖數據的一張存儲用戶信息的user表格,當從數據庫中取出age=16的人的姓名name
//com.seven.www.findByAge = "SELECT name FROM user_info WHERE age = 16"
String userName = session.selectOne("com.seven.www.findByAge");
System.out.println(userName == ""); //false
System.out.println(userName == null); //false
System.out.println(userName.equals("")); //true
System.out.println(userName.equals(null)); //false
如果查詢的是age=17的呢,結果如何呢?
//com.seven.www.findByAge = "SELECT name FROM user_info WHERE age = 17"
String userName = session.selectOne("com.seven.www.findByAge");
System.out.println(userName == ""); //false
System.out.println(userName == null); //true
System.out.println(userName.equals("")); //報錯,空指針
System.out.println(userName.equals(null));
由以上延伸另一個寫代碼的好習慣,string類型判斷變量是否與某個字符串相等時或者判斷是否為空時,將變量放在equals里面,如:”“.equals(userName)。
判空的最好方法為:
if(userName == null || userName == "")
講解下Java空字符串與null比較的原理:
1、類型
null表示的是一個對象的值,而並不是一個字符串。例如聲明一個對象的引用,String a = null ;
“”表示的是一個空字符串,也就是說它的長度為0。例如聲明一個字符串String str = “” ;
2、內存分配
String str = null ; 表示聲明一個字符串對象的引用,但指向為null,也就是說還沒有指向任何的內存空間;
String str = “”; 表示聲明一個字符串類型的引用,其值為”“空字符串,這個str引用指向的是空字符串的內存空間;
在java中變量和引用變量是存在棧中(stack),而對象(new產生的)都是存放在堆中(heap):
就如下:
String str = new String(“abc”) ;
ps:=左邊的是存放在棧中(stack),=右邊是存放在堆中(heap)。
== 比較的是地址,方法 .equals()比較的是值
————————————————
版權聲明:本文為CSDN博主「seven_cool」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/seven_cool/article/details/78470742