空串java
『壹』 java中做字元串非空判斷,為什麼要同時判斷字元串不為null和不等於空串
字元串為空白是沒有什麼意義的,一般不能為null的時候同樣不希望他是空串,如果可以為空串,那麼在出現null的時候直接使用空串即可。
例如:用戶名,用戶名不應該為null。
那麼他可以為「」這樣的空白串嗎?很明顯,這樣也是不可以的,因此要判斷不為空串,另外我看到題目中是「不等於」,感覺是 != 這樣,我建議你使用String的equals方法判別字元串是否相等,而不是「!=」。
你可以這樣寫:"".equals(oneString);
如果你需要的只是字元串不為空,你可以允許他為空白,那麼你可以這樣寫:
Optional.ofNullable(oneString).orElse("");
『貳』 java字元串問題
1.
首先String不屬於8種基本數據類型,String是一個對象。
因為對象的默認值是null,所以String的默認值也是null;但它又是一種特殊的對象,有其它對象沒有的一些特性。
2.
new String()和new String(「」)都是申明一個新的空字元串,是空串不是null;
3.
String str=」kvill」;
String
str=new String (「kvill」);的區別:
在這里,我們不談堆,也不談棧,只先簡單引入常量池這個簡單的概念。
常量池(constant
pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。它包括了關於類、方法、介面等中的常量,也包括字元串常量。
看例1:
String
s0=」kvill」;
String
s1=」kvill」;
String
s2=」kv」 + 「ill」;
System.out.println(
s0==s1 );
System.out.println(
s0==s2 );
結果為:
true
true
首先,我們要知道Java會確保一個字元串常量只有一個拷貝。
因為例子中的s0和s1中的」kvill」都是字元串常量,它們在編譯期就被確定了,所以s0==s1為true;而」kv」和」ill」也都是字元串常量,當一個字元串由多個字元串常量連接而成時,它自己肯定也是字元串常量,所以s2也同樣在編譯期就被解析為一個字元串常量,所以s2也是常量池中
」kvill」的一個引用。
所以我們得出s0==s1==s2;
用new
String() 創建的字元串不是常量,不能在編譯期就確定,所以new String() 創建的字元串不放入常量池中,它們有自己的地址空間。
看例2:
String
s0=」kvill」;
String
s1=new String(」kvill」);
String
s2=」kv」 + new String(「ill」);
System.out.println(
s0==s1 );
System.out.println(
s0==s2 );
System.out.println(
s1==s2 );
結果為:
false
false
false
例2中s0還是常量池中」kvill」的應用,s1因為無法在編譯期確定,所以是運行時創建的新對象」kvill」的引用,s2因為有後半部分new
String(「ill」)所以也無法在編譯期確定,所以也是一個新創建對象」kvill」的應用;明白了這些也就知道為何得出此結果了。
4.
String.intern():
再補充介紹一點:存在於.class文件中的常量池,在運行期被JVM裝載,並且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern()方法時,Java查找常量池中是否有相同Unicode的字元串常量,如果有,則返回其的引用,如果沒有,則在常量池中增加一個Unicode等於str的字元串並返回它的引用;看例3就清楚了
例3:
String
s0= 「kvill」;
String
s1=new String(」kvill」);
String
s2=new String(「kvill」);
System.out.println(
s0==s1 );
System.out.println(
「**********」 );
s1.intern();
s2=s2.intern();
//把常量池中「kvill」的引用賦給s2
System.out.println(
s0==s1);
System.out.println(
s0==s1.intern() );
System.out.println(
s0==s2 );
結果為:
false
**********
false
//雖然執行了s1.intern(),但它的返回值沒有賦給s1
true
//說明s1.intern()返回的是常量池中」kvill」的引用
true
最後我再破除一個錯誤的理解:
有人說,「使用String.intern()方法則可以將一個String類的保存到一個全局String表中,如果具有相同值的Unicode字元串已經在這個表中,那麼該方法返回表中已有字元串的地址,如果在表中沒有相同值的字元串,則將自己的地址注冊到表中「如果我把他說的這個全局的
String表理解為常量池的話,他的最後一句話,「如果在表中沒有相同值的字元串,則將自己的地址注冊到表中」是錯的:
看例4:
String
s1=new String("kvill");
String
s2=s1.intern();
System.out.println(
s1==s1.intern() );
System.out.println(
s1+" "+s2 );
System.out.println(
s2==s1.intern() );
結果:
false
kvill
kvill
true
在這個類中我們沒有聲名一個」kvill」常量,所以常量池中一開始是沒有」kvill」的,當我們調用s1.intern()後就在常量池中新添加了一個」kvill」常量,原來的不在常量池中的」kvill」仍然存在,也就不是「將自己的地址注冊到常量池中」了。
s1==s1.intern()為false說明原來的「kvill」仍然存在;
s2現在為常量池中「kvill」的地址,所以有s2==s1.intern()為true。
5.
關於equals()和==:
這個對於String簡單來說就是比較兩字元串的Unicode序列是否相當,如果相等返回true;而==是比較兩字元串的地址是否相同,也就是是否是同一個字元串的引用。
6.
關於String是不可變的
這一說又要說很多,大家只要知道String的實例一旦生成就不會再改變了,比如說:String
str=」kv」+」ill」+」 「+」ans」;
就是有4個字元串常量,首先」kv」和」ill」生成了」kvill」存在內存中,然後」kvill」又和」
「 生成 」kvill 「存在內存中,最後又和生成了」kvill
ans」;並把這個字元串的地址賦給了str,就是因為String的「不可變」產生了很多臨時變數,這也就是為什麼建議用StringBuffer的原因了,因為StringBuffer是可改變的。
『叄』 java中空串的作用和含義
代碼解釋:int n=4; //總共4行 for(int j=0;j<n;j++){ //控制行 for(int i=1;i<=j+1;i++){ //控制增長數字(1~當前第N行)System.out.print(i+" "); //列印數字,用空格分割數字,以便顯示1 2(1和2之間的空格)}for(int k=j;k>0;k-- ){ //控制增長數字(當前第N-1行~1)System.out.print(k+" "); //列印數字,用空格分割數字,以便顯示2 1(2和1之間的空格)}System.out.println(); //列印完之後換行}
『肆』 java字元串中的空串佔用系統內存嗎
您好,提問者:
我們利用程序來分析下在計算機中內存使用情況。
String a = null; //這在系統中指向的是null,也就說沒有在系統中開辟內存空間。
String b = ""; //這在系統中指向的是"",會在系統中開辟內存空間,而且它的對應的值是"";
好比int i; 這里的int類型雖然沒有給出值,但是JAVA內部定義了一個默認值就是0,也是開辟內存空間的。
『伍』 java中怎麼判斷字元串是否為空
字元串是否為空有兩種:
一種是:空串
另一種是:null
判斷方式如下:
Stringstr="";
if(str!=null&&"".equals(str)){
//業務邏輯
}
『陸』 Java空字元串與null的區別和判斷字元串是否為空的方法
雖然都是沒有信息,但是null代表堆內存中根本沒有這個東西,而空字元串就完全不同了,空字元串也是字元串,他是有內存空間的
判斷字元串是否為空
/**
*判斷字元串是否為空
*@paramstr字元串
*@return是否為空
*/
(Stringstr){
returnstr==null||str.trim().length()==0;
}
『柒』 java中做字元串非空判斷,為什麼要同時判斷字元串不為null和不等於空串
對於null而言。如果一個字元串為null,例如String a = null; 那麼此時,調用字元串對象a的方法,例如a.length(); 就會報空指針異常,即NullPointerException。如果這個異常沒有被catch住的話,a.length();後面的代碼就都不會被執行了。同時,如果這個程序是伺服器程序,那麼還會出現500這種屬於比較嚴重的問題。所以,在使用字元串對象前要先判斷一下其不為null。
不等於空串這個就是根據具體業務而定了,空串也就是字元串長度為0。那麼這種字元串在很多時候是沒什麼意義的。如果一個字元串是空串,那麼就可以不執行後面的業務邏輯了(視具體業務而定)。所以這種情況也需要判斷。
『捌』 java中做字元串非空判斷,為什麼要同時判斷字元串不為null和不等於空串
首先,不為null:
如果為null的話,後面會傳值會拋異常,如果你沒做異常處理,那麼會影響你後面代碼的執行,也就是說程序會在拋出異常的那一刻停止運行(非循環情況)
然後,不為空(字元串中不添加任何內容s="")
有些時候,一些程序需要變數有個初始值,比如我想在s="s"的時候將它置空,然後輸出,這時候s就不能為空字元串了
不過一般情況下很少做s=""判斷,基本上開始都會讓s="",然後在代碼的執行過程中,讓它等於某些值,然後進行某些判斷,不過需要注意的是,在開始賦值是不能寫成String s;,這樣的話s就是null了,這時候如果下面有針對該值的判斷,編譯器就會報錯
『玖』 java中的空串""和null的區別講解
空串"",的意思是:有個串,這個串有個合法的地址,只是裡面的內容為「」(空)。
null,的意思是:地址就是「空」。在C及其衍生的語言里,包括java,「空」被認為是個非法地址,因此不存在「串」。
希望你能明白了,有問題繼續交流,謝謝
『拾』 java中做字元串非空判斷,為什麼要同時判斷字元串不為null和不等於空串
你好,很高興回答你的問題。
判斷字元串是否是空串,首先要判斷有沒有這么一個對象,即不為null,然後才判斷這個對象是不是空串。不然如果對象不存在,直接判斷是不是空串就會拋空指針異常了。
如果有幫助到你,請點擊採納。