亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談String類型等值比較引起的“==”、“equals()”和“hashCode”思考

 更新時(shí)間:2020年09月16日 09:23:41   作者:BigData_Hubert  
這篇文章主要介紹了淺談String類型等值比較引起的“==”、“equals()”和“hashCode”思考。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

關(guān)于String類型的等值比較和內(nèi)容比較,是學(xué)習(xí)java甚至任何編程語(yǔ)言所共同的常見(jiàn)問(wèn)題,理解String類型的等值比較和內(nèi)容比較也是面試經(jīng)常問(wèn)到的問(wèn)題。

String類型的等值比較和內(nèi)容比較

字符串等值比較

public final class String
  implements java.io.Serializable, Comparable<String>, CharSequence {
  /** The value is used for character storage. */
  private final char value[];
 
   public boolean equals(Object anObject) {
    if (this == anObject) {
      return true;
    }
    if (anObject instanceof String) {
      String anotherString = (String)anObject;
      int n = value.length;
      if (n == anotherString.value.length) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = 0;
        while (n-- != 0) {
          if (v1[i] != v2[i])
            return false;
          i++;
        }
        return true;
      }
    }
    return false;
  }

首先,如上述String的源碼可以知道的是,java中等值比較,就是“==”比較,比較的是地址。字符串本質(zhì)上是final修飾的字符數(shù)組,也就是說(shuō),當(dāng)創(chuàng)建字符串對(duì)象時(shí),字符串的引用是常量,但它每一個(gè)對(duì)象的值可以改變。

字符串內(nèi)容比較

如上述String的源碼可以知道的是,字符串的內(nèi)容比較就是所謂的字符串的equals()方法,比較的是兩個(gè)字符串對(duì)象儲(chǔ)存的值,也就是內(nèi)容是否相等,所謂內(nèi)容相同,就是字符串每一個(gè)位置的字符相同。這里值得注意的是String重寫(xiě)了Object的equals()方法(Object的==與equals()是一樣的)

地址分配圖示

很明顯str1和str2的地址相同,他們與str3的地址不相同,但是str3通過(guò)方法intern(),可以強(qiáng)制入池,和str1和str2的地址相同。

結(jié)論

字符串:默認(rèn)為常量------------進(jìn)常量池

String val = “xxx”;---------------------------默認(rèn)入池

String val = new String(“xxx”);--------------------------默認(rèn)入堆,但可以通過(guò)intern()強(qiáng)制入池(堆里的對(duì)象還在)

上面只是簡(jiǎn)單的介紹string類的對(duì)象等值比較,下面我們來(lái)深刻的了解下java 對(duì)象的等值判斷。

對(duì)象相等判斷

== 和 equals 的區(qū)別是什么

== : 它的作用是判斷兩個(gè)對(duì)象的地址是不是相等。即,判斷兩個(gè)對(duì)象是不是同一個(gè)對(duì)象。(基本數(shù)據(jù)類型 == 比較的是值,引用數(shù)據(jù)類型 == 比較的是內(nèi)存地址)

equals() : 它的作用也是判斷兩個(gè)對(duì)象是否相等。但它一般有兩種使用情況:

情況1:類沒(méi)有覆蓋 equals() 方法。則通過(guò) equals() 比較該類的兩個(gè)對(duì)象時(shí),等價(jià)于通過(guò)“==”比較這兩個(gè)對(duì)象。

情況2:類覆蓋了 equals() 方法。一般,我們都覆蓋 equals() 方法來(lái)兩個(gè)對(duì)象的內(nèi)容相等;若它們的內(nèi)容相等,則返回 true (即,認(rèn)為這兩個(gè)對(duì)象相等)。

舉個(gè)例子:

public class test1 {
  public static void main(String[] args) {
    String a = new String("ab"); // a 為一個(gè)引用
    String b = new String("ab"); // b為另一個(gè)引用,對(duì)象的內(nèi)容一樣
    String aa = "ab"; // 放在常量池中
    String bb = "ab"; // 從常量池中查找
    if (aa == bb) // true
      System.out.println("aa==bb");
    if (a == b) // false,非同一對(duì)象
      System.out.println("a==b");
    if (a.equals(b)) // true
      System.out.println("aEQb");
    if (42 == 42.0) { // true
      System.out.println("true");
    }
  }
}

說(shuō)明:

String中的equals方法是被重寫(xiě)過(guò)的,因?yàn)閛bject的equals方法是比較的對(duì)象的內(nèi)存地址,而String的equals方法比較的是對(duì)象的值。

當(dāng)創(chuàng)建String類型的對(duì)象時(shí),虛擬機(jī)會(huì)在常量池中查找有沒(méi)有已經(jīng)存在的值和要?jiǎng)?chuàng)建的值相同的對(duì)象,如果有就把它賦給當(dāng)前引用。如果沒(méi)有就在常量池中重新創(chuàng)建一個(gè)String對(duì)象。

hashCode 與 equals (重要)

HashSet如何檢查重復(fù)

兩個(gè)對(duì)象的 hashCode() 相同,則 equals() 也一定為 true,對(duì)嗎?

hashCode和equals方法的關(guān)系

面試官可能會(huì)問(wèn)你:“你重寫(xiě)過(guò) hashcode 和 equals 么,為什么重寫(xiě)equals時(shí)必須重寫(xiě)hashCode方法?”

hashCode()介紹

hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)哈希碼的作用是確定該對(duì)象在哈希表中的索引位置。hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode()函數(shù)。

散列表存儲(chǔ)的是鍵值對(duì)(key-value),它的特點(diǎn)是:能根據(jù)“鍵”快速的檢索出對(duì)應(yīng)的“值”。這其中就利用到了散列碼?。梢钥焖僬业剿枰膶?duì)象)

為什么要有 hashCode

我們以“HashSet 如何檢查重復(fù)”為例子來(lái)說(shuō)明為什么要有 hashCode:

當(dāng)你把對(duì)象加入 HashSet 時(shí),HashSet 會(huì)先計(jì)算對(duì)象的 hashcode 值來(lái)判斷對(duì)象加入的位置,同時(shí)也會(huì)與其他已經(jīng)加入的對(duì)象的 hashcode 值作比較,如果沒(méi)有相符的hashcode,HashSet會(huì)假設(shè)對(duì)象沒(méi)有重復(fù)出現(xiàn)。但是如果發(fā)現(xiàn)有相同 hashcode 值的對(duì)象,這時(shí)會(huì)調(diào)用 equals()方法來(lái)檢查 hashcode 相等的對(duì)象是否真的相同。如果兩者相同,HashSet 就不會(huì)讓其加入操作成功。如果不同的話,就會(huì)重新散列到其他位置。這樣我們就大大減少了 equals 的次數(shù),相應(yīng)就大大提高了執(zhí)行速度。

hashCode()與equals()的相關(guān)規(guī)定

如果兩個(gè)對(duì)象相等,則hashcode一定也是相同的

兩個(gè)對(duì)象相等,對(duì)兩個(gè)對(duì)象分別調(diào)用equals方法都返回true

兩個(gè)對(duì)象有相同的hashcode值,它們也不一定是相等的

因此,equals 方法被覆蓋過(guò),則 hashCode 方法也必須被覆蓋

hashCode() 的默認(rèn)行為是對(duì)堆上的對(duì)象產(chǎn)生獨(dú)特值。如果沒(méi)有重寫(xiě) hashCode(),則該 class 的兩個(gè)對(duì)象無(wú)論如何都不會(huì)相等(即使這兩個(gè)對(duì)象指向相同的數(shù)據(jù))

對(duì)象的相等與指向他們的引用相等,兩者有什么不同?

對(duì)象的相等 比的是內(nèi)存中存放的內(nèi)容是否相等而 引用相等 比較的是他們指向的內(nèi)存地址是否相等。

以上這篇淺談String類型等值比較引起的“==”、“equals()”和“hashCode”思考就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決Hibernate4執(zhí)行save()或update()無(wú)效問(wèn)題的方法

    解決Hibernate4執(zhí)行save()或update()無(wú)效問(wèn)題的方法

    這篇文章主要為大家詳細(xì)介紹了解決Hibernate4執(zhí)行save()或update()無(wú)效問(wèn)題的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解

    Java Metrics系統(tǒng)性能監(jiān)控工具的使用詳解

    Metrics是一個(gè)Java庫(kù),可以對(duì)系統(tǒng)進(jìn)行監(jiān)控,統(tǒng)計(jì)一些系統(tǒng)的性能指標(biāo)。本文就來(lái)和大家詳細(xì)聊聊這個(gè)工具的具體使用,希望對(duì)大家有所幫助
    2022-11-11
  • java字符串求并集的方法

    java字符串求并集的方法

    這篇文章主要介紹了java字符串求并集的方法,涉及Java字符串操作中union方法的使用,是Java字符串操作中非常實(shí)用的基本技巧,需要的朋友可以參考下
    2014-11-11
  • JAVA判斷兩個(gè)時(shí)間之間的差

    JAVA判斷兩個(gè)時(shí)間之間的差

    經(jīng)常會(huì)遇到需要判斷兩個(gè)時(shí)間之間的差異的情況,本文主要介紹了JAVA計(jì)算兩個(gè)時(shí)間之間的差,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • IDEA快速搭建Java開(kāi)發(fā)環(huán)境的教程圖解

    IDEA快速搭建Java開(kāi)發(fā)環(huán)境的教程圖解

    這篇文章主要介紹了IDEA如何快速搭建Java開(kāi)發(fā)環(huán)境,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java批量插入數(shù)據(jù)的代碼實(shí)現(xiàn)

    Java批量插入數(shù)據(jù)的代碼實(shí)現(xiàn)

    日常工作或者學(xué)習(xí)中,可能會(huì)遇到批量插入數(shù)據(jù)的需求,一般情況下數(shù)據(jù)量少的時(shí)候,我們會(huì)直接調(diào)用批量接口插入數(shù)據(jù)即可,當(dāng)數(shù)據(jù)量特別大時(shí),我們就會(huì)用到分批插入數(shù)據(jù),所以本文給大家介紹了Java批量插入數(shù)據(jù)的代碼實(shí)現(xiàn),需要的朋友可以參考下
    2024-01-01
  • SpringBoot環(huán)境搭建圖文教程

    SpringBoot環(huán)境搭建圖文教程

    這篇文章主要為大家詳細(xì)介紹了SpringBoot環(huán)境搭建圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • springboot實(shí)現(xiàn)maven多模塊和打包部署

    springboot實(shí)現(xiàn)maven多模塊和打包部署

    本文主要介紹了springboot實(shí)現(xiàn)maven多模塊和打包部署,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Springboot整合Gson報(bào)錯(cuò)問(wèn)題解決過(guò)程

    Springboot整合Gson報(bào)錯(cuò)問(wèn)題解決過(guò)程

    這篇文章主要介紹了Springboot整合Gson報(bào)錯(cuò)問(wèn)題解決過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java基礎(chǔ)語(yǔ)法之二維數(shù)組詳解

    Java基礎(chǔ)語(yǔ)法之二維數(shù)組詳解

    這篇文章主要介紹了Java基礎(chǔ)語(yǔ)法之二維數(shù)組詳解,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論