国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

Java中String判斷值為null或空及地址是否相等的問題

2019-11-26 14:39:09
字體:
來源:轉載
供稿:網友

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.javac:/>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"不是靜態字符串,是不共享的

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安徽省| 金堂县| 苍山县| 张家港市| 阆中市| 若尔盖县| 永靖县| 天峨县| 于田县| 伊宁县| 台中县| 勃利县| 武冈市| 前郭尔| 宁强县| 博客| 清涧县| 安阳市| 睢宁县| 鸡东县| 东乌| 林西县| 大足县| 临潭县| 清丰县| 杂多县| 缙云县| 永丰县| 栖霞市| 彰化县| 精河县| 昆明市| 富源县| 泰顺县| 威海市| 阿瓦提县| 达尔| 三原县| 乐清市| 巢湖市| 浦东新区|