最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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ù)組,也就是說,當創(chuàng)建字符串對象時,字符串的引用是常量,但它每一個對象的值可以改變。

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

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

地址分配圖示

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

結(jié)論

字符串:默認為常量------------進常量池

String val = “xxx”;---------------------------默認入池

String val = new String(“xxx”);--------------------------默認入堆,但可以通過intern()強制入池(堆里的對象還在)

上面只是簡單的介紹string類的對象等值比較,下面我們來深刻的了解下java 對象的等值判斷。

對象相等判斷

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

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

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

情況1:類沒有覆蓋 equals() 方法。則通過 equals() 比較該類的兩個對象時,等價于通過“==”比較這兩個對象。

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

舉個例子:

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

說明:

String中的equals方法是被重寫過的,因為object的equals方法是比較的對象的內(nèi)存地址,而String的equals方法比較的是對象的值。

當創(chuàng)建String類型的對象時,虛擬機會在常量池中查找有沒有已經(jīng)存在的值和要創(chuàng)建的值相同的對象,如果有就把它賦給當前引用。如果沒有就在常量池中重新創(chuàng)建一個String對象。

hashCode 與 equals (重要)

HashSet如何檢查重復

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

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

面試官可能會問你:“你重寫過 hashcode 和 equals 么,為什么重寫equals時必須重寫hashCode方法?”

hashCode()介紹

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

散列表存儲的是鍵值對(key-value),它的特點是:能根據(jù)“鍵”快速的檢索出對應的“值”。這其中就利用到了散列碼!(可以快速找到所需要的對象)

為什么要有 hashCode

我們以“HashSet 如何檢查重復”為例子來說明為什么要有 hashCode:

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

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

如果兩個對象相等,則hashcode一定也是相同的

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

兩個對象有相同的hashcode值,它們也不一定是相等的

因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋

hashCode() 的默認行為是對堆上的對象產(chǎn)生獨特值。如果沒有重寫 hashCode(),則該 class 的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數(shù)據(jù))

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

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

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

相關(guān)文章

  • Java實現(xiàn)UTF-8編碼與解碼方式

    Java實現(xiàn)UTF-8編碼與解碼方式

    這篇文章主要介紹了Java實現(xiàn)UTF-8編碼與解碼方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • mybatis的使用-Mapper文件各種語法介紹

    mybatis的使用-Mapper文件各種語法介紹

    這篇文章主要介紹了mybatis的使用-Mapper文件各種語法介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • SpringBoot+MyBatis-Plus實現(xiàn)分頁示例

    SpringBoot+MyBatis-Plus實現(xiàn)分頁示例

    本文介紹了SpringBoot+MyBatis-Plus實現(xiàn)分頁示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • 教你怎么解決IDEA中“\t“空格顯示不正確的問題

    教你怎么解決IDEA中“\t“空格顯示不正確的問題

    在之前進行先來先服務(FCFS)調(diào)度算法的模擬過程中,使用IDEA進行開發(fā)時遇到了"\t"無法補全當前字符串長度到8的整數(shù)倍的問題.百度一圈發(fā)現(xiàn)也有很多程序員遇到了這樣的問題,但是沒有解決方法,于是有了這篇文章,需要的朋友可以參考下
    2021-05-05
  • Java 在Word中創(chuàng)建郵件合并模板并合并文本和圖片的操作方法

    Java 在Word中創(chuàng)建郵件合并模板并合并文本和圖片的操作方法

    通過Java程序展示如何來實現(xiàn)創(chuàng)建模板,并通過郵件合并功能來合并文本數(shù)據(jù)和圖片數(shù)據(jù)的方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-07-07
  • SpringBoot中項目如何讀取外置logback配置文件

    SpringBoot中項目如何讀取外置logback配置文件

    這篇文章主要介紹了SpringBoot中項目如何讀取外置logback配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • idea創(chuàng)建Springboot多模塊項目(聚合項目)

    idea創(chuàng)建Springboot多模塊項目(聚合項目)

    文章詳細介紹了如何在idea創(chuàng)建Springboot多模塊項目(聚合項目),包括創(chuàng)建父工程和子工程、編輯pom.xml文件、編寫代碼和測試,還介紹了如何處理Maven視圖中的層級關(guān)系,并展示了如何同時啟動多個子項目
    2024-11-11
  • SpringBoot + JPA @ManyToMany的操作要點說明

    SpringBoot + JPA @ManyToMany的操作要點說明

    這篇文章主要介紹了SpringBoot + JPA @ManyToMany的操作要點說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 為什么ConcurrentHashMap的key value不能為null,map可以?

    為什么ConcurrentHashMap的key value不能為null,map可以?

    這篇文章主要介紹了為什么ConcurrentHashMap的key value不能為null,map可以呢?具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java中通過三級緩存解決Spring循環(huán)依賴詳解

    Java中通過三級緩存解決Spring循環(huán)依賴詳解

    這篇文章主要介紹了Java中通過三級緩存解決Spring循環(huán)依賴詳解,當出現(xiàn)兩個或多個 Bean 在初始化時相互依賴的情況時,Spring Boot 會將其中一個 Bean 提前暴露出來,以便其他 Bean 能夠在初始化時正確地引用它,這一策略能有效避免循環(huán)依賴導致的問題,需要的朋友可以參考下
    2023-09-09

最新評論

曲沃县| 新化县| 星子县| 乌拉特中旗| 五大连池市| 瑞金市| 将乐县| 诏安县| 庆阳市| 衡阳县| 襄垣县| 许昌县| 高尔夫| 奉节县| 巴里| 南和县| 珲春市| 象州县| 隆林| 望城县| 曲周县| 万荣县| 靖安县| 临颍县| 濉溪县| 昌邑市| 舒城县| 太和县| 浑源县| 班玛县| 巴塘县| 大悟县| 资兴市| 清丰县| 卓资县| 万盛区| 山阳县| 白城市| 射洪县| 贵阳市| 新安县|