『壹』 java中的字元串被賦值null和""有區別么
兩者是復有區別的:
堆棧中制:假設聲明String s1 = null;String s2 = 「」;
其實上棧中會有存放s1,但是堆中沒有產生數據;但是對於第二條語句,不僅棧中有s2,堆中也會有「」(空字元串,假如以前存在的話,s2會直接指向,假如沒有,就會新建一個);
方法引用:s1為null,不能調用String的任何方法,否則會報NullPointerException異常;而「」則可以調用String的任何方法,如字元串的拼接或者是求長度等。
『貳』 java null 鍜岀┖鐨勫尯鍒
涓鑸鎯呭喌涓 . java涓鐨刵ull灝辨槸鎸囩殑絀 .
浣嗘槸紼嶅井娉ㄦ剰鐨勬槸 絀瀛楃︿覆"" 鍜宯ull鏄鏈夊尯鍒鐨
"" 浠h〃鏈夊瓧絎︿覆, 浣嗘槸瀛楃︿覆鍐呭逛負絀, 闀垮害涓0
null琛ㄧず瀵硅薄涓虹┖
濡傛灉鐢ㄤ負null鐨勫硅薄鍘昏皟鐢ㄦ柟娉, 灝變細鍑虹幇絀烘寚閽堝紓甯
鎵浠 鍦ㄥ瓧絎︿覆榪涜屽唴瀹規瘮杈冩椂 ,瑕 浣跨敤涓嶄負絀虹殑瀛楃︿覆 鍘昏皟鐢ㄦ瘮杈冩柟娉,
鍙傝冧唬鐮佸備笅
publicclassTest{
publicstaticvoidmain(String[]args){
Stringstr1=null;
Stringstr2="";
System.out.println(str1==str2);//false
System.out.println(str2.equals(str1));//false
System.out.println(str1.equals(str2));//絀烘寚閽堝紓甯竕ava.lang.NullPointerException
}
}
『叄』 java 字元串為null 如何判斷
定義 String str;
判斷字元串是否空涉及兩個層次:
1、是首先判斷字元串變數的引用是否為空,即空對象的概念,用null來判斷,可以用if(str==null) 判斷 str是否為空;(注意不能用equals(null),在參數為null情況下,返回值永遠是false);
2、是在不為空對象的情況下,在判斷字元串對象是否為空串,即長度為0.用length()==0。 關鍵是搞清楚字元串對象為空和空字元串有區別。
拓展內容
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") ;
『肆』 Java空字元串與null的區別和判斷字元串是否為空的方法
一、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)。
二、判斷字元串是否為空的方法
String str = null;
if(str.equals("") || str= == null){//會拋出異常
System.out.println("成功");
}
『伍』 java中null和'的區別
null和""的區別
問題一:
null和""的區別
String s=null;
string.trim()就會拋出為空的exception
String s="";
string.trim()就不會拋,為什麼?
答:
NULL代表聲明了一個空對象,根本就不是一個字元串。
""代表聲明了一個對象實例,這個對象實例的值是一個長度為0的空字元串。
NULL代表聲明了一個空對象,對空對象做任何操作都不行的,除了=和==
""是一個字元串了,只是這個字元串裡面沒有內容了
String s=null;只是定義了一個句柄,也就是說你有了個引用,但是這個引用未指向任何內存空間
String s="";這個引用已經指向了一塊是空字元串的內存空間,是一個實際的東東了,所以你可以對它操作,而不用擔心什麼了
你說數字0和沒有是不是一種概念啊??道理一樣的
而且,null可以賦值給任何對象.""就不行了.
這里""和NULL絕對是兩個概念
""代表一個字元串存在,它的值就是「」
NULL代表字元串根本沒有實際的值,你並不知道它是什麼。。。
哦,我明白了,意思就是String string = null 跟String string;是一回事兒
null是空對象 ""是空字元串
String s=null;//null是未分配堆內存空間
String a;//分配了一個內存空間,沒存入任何對象
String a="";//分配了一個內存空間,存了一個字元串對象
問題二:
String s;和String s=null;和String s="a";有什麼區別?
針對這三種情況,使用out.println(s);的時候,第一個會出現異常,第二個會輸出null.第三個則會輸出a.
這是為什麼呢?這三句聲明語句,各自作了什麼呢?
答:
第一個只是定義了一個String類型變數s,並沒有給它賦初值,在Java中,默認在使用一個變數的時候必須賦予它初值(降低風險)。
第二個和第三個都定義了String類型變數s,並賦予它初值,只不過第二個賦予的值為null(空)罷了
主要要理解的是String s; s為一個引用~~它不是對象
第一個是沒有初始化的引用;
第二個為空引用;
第三個是在字元串池裡寫入一個字元'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==null || a==""){}這種寫法也是正確的
問題四:
String abc=null;String abc="";String abc;三種寫法有什麼區別?
答:
1:創建一個空字元串對象,
2:創建一個字元串為空的字元串對象。
3:聲明一個字元串對象,但並沒有分配內存,而1,2已經分配了內存
對於最後一種表示,你不能if(abc==null),或者int length = abc.length();編譯的時候會提示可能沒有初始化.
String abc=null;
String abc="";
一般推薦使用第二種
第一種abc指向null,很多時候要判斷字元串是否為空時,容易漏掉這種情況,在調用String的相關方法的時候就會出錯
第二種則相對簡單,String的方法都可以用,判斷的時候也不會出錯
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是一個內容不可變的量,運用的是設計模式GOF.FlyWeight
但有個關鍵的一點,沒有人說到,這就是:
String s;在什麼情況下可以等同於String s=null;而在什麼情況下又不等同?!
考慮下面的代碼:
//StringTest.java
public class StringTest {
static String s; //*
public static void main(String[] args) {
//String s; //**
System.out.println(s);
}
}
編譯並運行上面的代碼,將列印null。
可見標有*號的行是自動初始化了的(s被自動初始化為null)。
而如果把標有**號的行取消注釋,代碼將不能通過編譯,這是因為這行定義的是本地變數,而本地變數是不會自動初始化的。
由此得出結論:
在成員變數的定義中,String s;等同於String s=null;
而在本地變數(方法變數)的定義中,String s;不等同於String s=null;,這時要使用s必須顯式地賦值。
這些雖然是小知識點,但在實際應用中很重要,也很容易被一些人忽視,特此提出。
還有一點要說明的是:
只要是在方法在中定義變數都要顯示賦初值,main()方法也不例外,而在方法之外編譯器回自動賦初值。