Java中String斷定值為null或空及地址能否相等的成績。本站提示廣大學習愛好者:(Java中String斷定值為null或空及地址能否相等的成績)文章只能為提供參考,不一定能成為您想要的結果。以下是Java中String斷定值為null或空及地址能否相等的成績正文
String的null或空值的斷定處置
筆者在開辟進程中,經常碰著過上面這些毛病的用法:
1,毛病用法一:
if (name == "") {
//do something
}
2,毛病用法二:
if (name.equals("")) {
//do something
}
3,毛病用法三:
if (!name.equals("")) {
//do something
}
我們來講解一下:
上述毛病用法1是初學者最輕易犯,也最不輕易被發明的毛病,由於它們的語法自己沒成績,Java編譯器編譯時不報錯。但這類前提能夠在運轉時招致法式湧現bug,永久也不會為true,也就是時說,if塊裡的語句永久也不會被履行。
上述用法二,用法三 的寫法,是包含許多Java生手也很輕易犯的毛病,為何是毛病的呢?或許你會覺得疑惑。
對,它們的寫法自己沒錯,然則,少了一個null斷定的前提,試想,假如name=null的情形下,會產生甚麼效果呢?效果是,你的法式將拋出NullPointerException異常,體系將被掛起,不再供給正常辦事。
固然,假如之前曾經對name作了null斷定的情形破例。
准確的寫法應當先加上name != null的前提,如例:
if (name != null && !name.equals("")) {
//do something
}
或許
if (!"".equals(name)) {//將""寫在前頭,如許,不論name能否為null,都不會失足。
//do something
}
上面,我們舉一個簡略的例子:
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 毛病的寫法
//別用這類寫法
}
}
}
編譯履行:
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
}
}
總結:
1.new出來的String是從新分派內存,字符串不同享,new出來的多個之間也不同享。
2.經由過程字符串函數操作拼接或許截取到的字符串跟靜態字符串變量也是不同享的。
3.經由過程加號獲得的字符串有兩種情形。
A "he"+"llo"是靜態字符串,是同享的
B String a = "He"; a+"llo"不是靜態字符串,是不同享的