搜尋

首頁  >  問答  >  主體

Java中为什么查询空字符串跟判断是否为null的时候可以不用equals?

if(id!=null&&id!="")
代码中经常这样写,空字符串跟null 都不用equals吗?

大家讲道理大家讲道理2894 天前544

全部回覆(8)我來回復

  • 高洛峰

    高洛峰2017-04-17 17:53:37

    首先,你的id!=""這種寫法是錯的,要寫成!id.equals("")
    其次,要明白==equals的意思id!=""这种写法是错误的,要写成!id.equals("")
    其次,要明白==equals的含义

    1. ==表示两个对象是同一个对象的引用,==null表示这个对象不是任何实例对象的引用,该对象为空。

    2. equals

      1. ==表示兩個物件是同一個物件的引用,==null表示這個物件不是任何實例物件的引用,該物件為空。
    3. 🎜equals是String類別中的方法,表示兩個字串的內容相同。 🎜🎜 🎜

      回覆
      0
  • 怪我咯

    怪我咯2017-04-17 17:53:37

    一直都這麼寫的,同問,為啥呢?

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 17:53:37

    空字串其實是要用equals的,否則會出錯。 null是可以使用!=

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:53:37

    下面的程式碼,結果為false

    String d = new String("");
    System.out.println(""==d);

    所以必須使用equals來判斷空字串,如

    public static boolean isEmpty(String str) {
        return (str == null || "".equals(str));
    }

    或使用length來判斷並擴展到任何CharSequence,如

    public static boolean isEmpty(final CharSequence cs) {
        return cs == null || cs.length() == 0;
    }

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 17:53:37

    1.equals()方法存在於Object類別中,所有的包裝類別如IntegerLong等均對該函數進行了重新實現,假如你自己寫了一個類別在類別中使用equals()方法,該方法的效果等同於"==",會判斷兩個類別的物件參考是否相同,而在包裝類別中equals會判斷該物件的內容是否相等。
    2.如果判斷寫為if(id.equals("")&&id!=null),會存在NullPoint的問題,假如id的值為null,你去掉呼叫equals()方法將會拋出例外。 equals()方法存在于Object类中,所有的包装类如IntegerLong等均对该函数进行了重新实现,假如你自己写了一个类在类中使用equals()方法,该方法的效果等同于"==",会判断两个类的对象引用是否相同,而在包装类中equals会判断该对象的内容是否相等。
    2.如果该判断写为if(id.equals("")&&id!=null),会存在NullPoint的问题,假如id的值为null,你去掉调用equals()方法将会抛出异常。

    3.

    解释一下以上程序 str1 == str2比较的是两者的引用是否相同,我们声明的字符串会被存放到字符串常量池中,str1时会将abc放入常量池,str3的时候会首先检查常量池中是否有字符串abc有的话就会直接引用。str2因为是直接new了一个新的对象,所以地址肯定与str1的不同。那为什么使用了intern方法之后就相同了呢
    当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串,则返回池中的字符串,此时并不会去生成新的字符串。因为还是引用了常量池中的字符串所以str2.intern() == str1返回值还是true

    3.🎜 🎜 🎜解釋一下以上程式str1 == str2比較的是兩者的引用是否相同,我們宣告的字串會被存放到字串常數池中,str1時會將abc放入常數池,str3的時候會先檢查常數池中是否有字串abc有的話就會直接引用。 str2因為是直接new了一個新的對象,所以地址一定與str1的不同。那為什麼使用了intern方法之後就相同了呢
    當呼叫intern 方法時,如果池已經包含一個等於此String 物件的字串,則傳回池中的字串,此時並不會去產生新的字串。因為還是引用了常數池中的字串所以str2.intern() == str1回傳值還是true。 🎜 🎜以上,就是這些。 (●'◡'●)🎜

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 17:53:37

    id==null时,表示id这个引用没有指向任何对象,只是一个引用;Java中具体的对象才可以调用方法(这里就是equals())。所以当id==null时调用equals()是会抛出NullPointerException

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:53:37

    這程式碼寫錯,沒用equals比較空串,而且對於空字串有很多,例如tab,回車之類的都沒有check,有n多現成的函數可以用,例如apache commons裡面的StingUtils.isBlank方法,Guava的Strings.isNullOrEmpty方法都可以判斷null和空白字串的情況。

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:53:37

    還是要明白== 與equals 的區別, ""與null的區別,
    == 是比較值是否相等或引用類型的地址是否相等
    equals 是比較引用類型地址的值即內容是否相等

    回覆
    0
  • 取消回覆