Java中String判斷值為null或空及地址是否相等的問題
String的null或空值的判斷處理
筆者在開發(fā)過程中,常常碰到過下面這些錯(cuò)誤的用法:
1,錯(cuò)誤用法一:
if (name == "") {
//do something
}
2,錯(cuò)誤用法二:
if (name.equals("")) {
//do something
}
3,錯(cuò)誤用法三:
if (!name.equals("")) {
//do something
}
我們來解說一下:
上述錯(cuò)誤用法1是初學(xué)者最容易犯,也最不容易被發(fā)現(xiàn)的錯(cuò)誤,因?yàn)樗鼈兊恼Z法本身沒問題,Java編譯器編譯時(shí)不報(bào)錯(cuò)。但這種條件可能在運(yùn)行時(shí)導(dǎo)致程序出現(xiàn)bug,永遠(yuǎn)也不會(huì)為true,也就是時(shí)說,if塊里的語句永遠(yuǎn)也不會(huì)被執(zhí)行。
上述用法二,用法三 的寫法,是包括很多Java熟手也很容易犯的錯(cuò)誤,為什么是錯(cuò)誤的呢?也許你會(huì)感到納悶。
對,它們的寫法本身沒錯(cuò),但是,少了一個(gè)null判斷的條件,試想,如果name=null的情況下,會(huì)發(fā)生什么后果呢?后果是,你的程序?qū)伋鯪ullPointerException異常,系統(tǒng)將被掛起,不再提供正常服務(wù)。
當(dāng)然,如果之前已經(jīng)對name作了null判斷的情況例外。
正確的寫法應(yīng)該先加上name != null的條件,如例:
if (name != null && !name.equals("")) {
//do something
}
或者
if (!"".equals(name)) {//將""寫在前頭,這樣,不管name是否為null,都不會(huì)出錯(cuò)。
//do something
}
下面,我們舉一個(gè)簡單的例子:
TestNullOrEmpty.java
public class Test {
public static void main (String args[]){
String value = null;
testNullOrEmpty(value);
value = "";
testNullOrEmpty(value);
value = " ";
testNullOrEmpty(value);
value = "hello me";
testNullOrEmpty(value);
}
static void testNullOrEmpty(String value){
if(value == null){
System.out.println("value is null");
} else if ("".equals(value)){
System.out.println("value is blank but not null");
} else {
System.out.println("value is \"" + value + "\"");
}
if (value == "") { //NG 錯(cuò)誤的寫法
//別用這種寫法
}
}
}
編譯執(zhí)行:
c:\>javac TestNullOrEmpty.java c:\>java TestNullOrEmpty
value is null. value is blank but not null. value is " " value is "hello me!"
比較String地址相等
package com;
public class A
{
/**
* @param args
*/
public static void main(String[] args)
{
String a = "hello";
String b = "he";
String c = a.substring(0, 2);
System.out.println(b.equals(c));//true
System.out.println(b==c);//false
String d = new String("hello");
System.out.println(d.equals(a));//true
System.out.println(d==a);//false
String e = new StringBuilder("hello").toString();
System.out.println(e.equals(a));//true
System.out.println(e==a);//false
System.out.println(e.equals(d));//true
System.out.println(e==d);//false
String f = "hello";
System.out.println(f.equals(a));//true
System.out.println(f==a);//true
System.out.println(f=="hello");//true
System.out.println(f=="hell"+"o");//true
String g = b+"llo";
System.out.println(g==f);//false
String h = "he"+"llo";
System.out.println(h==f);//true
}
}
總結(jié):
1.new出來的String是重新分配內(nèi)存,字符串不共享,new出來的多個(gè)之間也不共享。
2.通過字符串函數(shù)操作拼接或者截取到的字符串跟靜態(tài)字符串變量也是不共享的。
3.通過加號得到的字符串有兩種情況。
A "he"+"llo"是靜態(tài)字符串,是共享的
B String a = "He"; a+"llo"不是靜態(tài)字符串,是不共享的
相關(guān)文章
JAVA PDF操作之實(shí)現(xiàn)截取N頁和多個(gè)PDF合并
這篇文章主要為大家詳細(xì)介紹了java關(guān)于PDF的一些操作,例如截取N頁并生成新文件,轉(zhuǎn)圖片以及多個(gè)PDF合并,文中的示例代碼講解詳細(xì),感興趣的可以了解下2025-01-01
maven打生產(chǎn)環(huán)境可執(zhí)行包的實(shí)現(xiàn)
本文主要介紹了maven打生產(chǎn)環(huán)境可執(zhí)行包的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
SpringBoot之HandlerInterceptor攔截器的使用詳解
這篇文章主要介紹了SpringBoot之HandlerInterceptor攔截器的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
SpringBoot項(xiàng)目接收前端參數(shù)的11種方式
在前后端項(xiàng)目交互中,前端傳遞的數(shù)據(jù)可以通過HTTP請求發(fā)送到后端, 后端在Spring Boot中如何接收各種復(fù)雜的前端數(shù)據(jù)呢?這篇文章總結(jié)了11種在Spring Boot中接收前端數(shù)據(jù)的方式,需要的朋友可以參考下2024-12-12
RocketMQ源碼解析topic創(chuàng)建機(jī)制詳解
這篇文章主要為大家介紹了RocketMQ源碼解析topic創(chuàng)建機(jī)制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
java多線程學(xué)習(xí)之死鎖的模擬和避免(實(shí)例講解)
下面小編就為大家?guī)硪黄猨ava多線程學(xué)習(xí)之死鎖的模擬和避免(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06

