1、類型
null表示的是一個對象的值,而並不是一個字符串。
例如聲明一個對象的引用,String a = null ;
""表示的是一個空字符串,也就是說它的長度為0,但它是一個字符串。
例如聲明一個字符串String str = “” ;
2、內存分配
String str = null ; 表示聲明一個字符串對象的引用,但指向為null,也就是說還沒有指向任何的內存空間;
String str = “”; 表示聲明一個字符串類型的引用,其值為""空字符串,這個str引用指向的是空字符串的內存空間;
“” :分配了內存 ,分配了一個空間
null :未分配內存
" " :分配了內存,分配了一個空間
string str1 = ""; //空字符串 str1.length() 等於 0
string str2 = null; //NULL
string str3 = " "; //空格串 str2.length() 等於 1
- 1
- 2
- 3
在java中變量和引用變量是存在棧中(stack),而對象(new產生的)都是存放在堆中(heap):
==============================================================================================
1、表示區別
string str1 = ""; //空字符串 str1.length() 等於 0
string str2 = null; //NULL
string str3 = " "; //空格串 str2.length() 等於 1
2、內存區別
"" :分配了內存 ,分配了一個空間
null :未分配內存
" " :分配了內存
3、使用區別
調用null的字符串的方法會拋出異常。
""是一個字符串(String).它在內存中是存在的.它可以使用Object對象中的方法(如"".toString();"".equals()) 。
null它是一個空對象,在內存中是不存在的。它不可以使用Object對象中的方法。
備注:
空格:本質上和abc一樣,它是一個字符。它的數值(ASCII)是32
'\0' :代表字符串的結束,數值(ASCII)是0
在開發的過程對字符的判斷是最正常的事,問題是我們可能很容易對java中的""(空串)和null造成混淆,現加以說明:
比如聲明一個 String str ;
如果說str是null,那么內存根本沒創建字符串對像,並由str引用。
如果說str是空串,那么確實存在一個由str引用的字符串對像,只不過這個字符串的值是""
null用來表示一個引用沒有實例存在,而""本身是一個實例,有自己的對象空間,和"zzyyxx"這樣的String沒什么區別。兩個都是有值 !!!
其次需要注意:
(1)當oracle 字段里面的值為空時,從oracle讀出來的是字符串"null"(可能是程序讀出來的時,將空對象轉換成為了字符串“null”)。
(2)還有URL得參數時如:oylin.jsp?id=<%=id%>,當id為空對象是,有可能也將空對象轉換成為了字符串“null”,在寫程序的時候要多加注意。
另一個問題就是String的null或空值的判斷處理:有以下兩種方法
f (name != null && !name.equals("")) {
//do something
}
或者
if (!"".equals(name)) {//將""寫在前頭,這樣,不管name是否為null,都不會出錯。
//do something
}
要判讀String是否為空字符串,比較簡單,只要判斷該String的length是否為0就可以,或者直接用方法isEmpty()來判斷。
但很多時候我們也會把由一些不可見的字符組成的String也當成是空字符串(e.g, space, tab, etc),這時候就不能單用length或isEmpty()來判斷了,因為technically上來說,這個String是非空的。這時候可以用String的方法trim(),去掉前導空白和后導空白,再判斷是否為空。
例:
public class TestEmpty
{
public static void main(String[] args){
String a = " ";
// if (a.isEmpty())
if (a.trim().isEmpty())
{
System.out.println("It is empty");
}
else
{
System.out.println("It is not empty");
}
}
}
結果:It is empty
聲明一個String str
如果說str是null,那么內存根本沒有創建字符串對象,並由str引用。
如果說str是空串,那么確定存在一個由str引用的字符串對象,只不過這個字符串的值是空
null用來表示沒有實例存在,而“”本身就是一個實例,有自己的對象空間,和“123456”這樣的字符串沒有區別。
其次要注意:
1)當oracle 字段里面的值為空時,從oracle讀出來的是字符串"null"(可能是程序讀出來的時,將空對象轉換成為了字符串“null”)。
(2)還有URL得參數時如:oylin.jsp?id=<%=id%>,當id為空對象是,有可能也將空對象轉換成為了字符串“null”,在寫程序的時候要多加注意。
另一個問題就是String的null或控制的判斷處理:有以下兩種方法
(name != null && !name.equals("")){
dosomething();
}
或者
if(!"".equals(name)){//將“”寫在前面,不管name是否為null,都不會報錯
dosomething();
}
————————————————
版權聲明:本文為CSDN博主「晨曦s」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/sinat_34089391/article/details/80292377