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

詳解Java中==和equals()的區(qū)別

 更新時間:2021年11月09日 09:42:33   作者:Code花卷  
這篇文章主要介紹了Java中==和equals()的區(qū)別,,==可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中,equals()是方法,只能用于引用數(shù)據(jù)類型,需要的朋友可以參考下

1. ==

== 是運算符,用來判斷兩個值是否相等,==可以使用在基本數(shù)據(jù)類型變量引用數(shù)據(jù)類型變量

1.1 基本數(shù)據(jù)類型

Java基本數(shù)據(jù)類型共有八種,可以分為三類

  • 字符類型char
  • 布爾類型boolean
  • 數(shù)值類型byte、short、int、long、float、double

這里有個例外,boolean不參與數(shù)值運算

int a1 = 10;
int a2 = 10;
System.out.println(a1==a2);  //true

float a3 = 5.0f;
float a4 = 5.0f;
System.out.println(a3==a4);  //true

……

上面給出幾組示例,相同數(shù)據(jù)類型可以相互比較不用多說了,那么不同數(shù)據(jù)類型呢?

int a1 = 10;
byte b1 = 10;
System.out.println(a1==b1);  //true

char c1 = 'A';
int c2 = 65;
System.out.println(c1 == c2);  //true

int a1 = 10;
double d1 = 10.0d;
System.out.println(a1==d1);  //true

int a1 = 10;
char e1 = 10;
System.out.println(a1==e1);  //true

可以看到,在基本數(shù)據(jù)類型的范圍內(nèi),不同數(shù)據(jù)類型也是可以直接比較的

如果比較的是基本數(shù)據(jù)類型,就是判斷兩個保存的數(shù)據(jù)是否相同(不一定類型相同)

1.2 引用數(shù)據(jù)類型

這里先寫一個Student類,用于參考

public class Student {
    public String name;
    public int age;

    public Student(){}

    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
}

實例化兩個Student對象,判斷是否相等

Student student1 = new Student("Tom", 18);
Student student2 = new Student("Tom", 18);
System.out.println(student1==student2);  //false

注意,這里出現(xiàn)了示例中的第一個false??梢钥吹剑词官x的值是相同的,但使用==判斷的結(jié)果為false,這是因為兩個對象在內(nèi)存中不指向同一地址。

如果比較的是引用類型,就是比較兩個變量是否代表同一對象實體,也就是是否指向同一地址

1.3 小結(jié)

==是運算符
可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中
如果比較的是基本數(shù)據(jù)類型,就是判斷兩個保存的數(shù)據(jù)是否相同,不一定類型相同
如果比較的是引用類型,就是比較兩個變量是否代表同一對象實體,也就是是否指向同一地址

2. equals

equals()是方法,只能用于引用數(shù)據(jù)類型

還是使用上面介紹到的Student對象,如果使用equals比較,那么?

Student student1 = new Student("Tom", 18);
Student student2 = new Student("Tom", 18);
System.out.println(student1.equals(student2));  //false

答案還是false,我們可以看一下在此處使用的equals的源碼

image-20211107192723195

使用的正是Object中的equals()方法(繼承),而Object中的equals()方法也是使用的==進行的比較

Object類中equals()和==的作用相同

誒,部分同學(xué)可能想說了,這個equals()和我們平時用的不太一樣啊,平時用的equals()好像是用來比較數(shù)值的。這里我們拿String類來舉例。

String str1 = new String("cun");
String str2 = new String("cun");
System.out.println(str1==str2);  //false
System.out.println(str1.equals(str2));  //true

使用==比較,不出意外是false。而這里使用equals(),得到的結(jié)果是true。我們看一下這里的equals()源碼(Java8版本)

image-20211107194053016

可以看到,String類中的equals()重寫了Object類中的equals(),這里側(cè)重于具體的數(shù)值比較(我們?nèi)粘J褂弥幸彩歉M容^具體的數(shù)值)。分析一下源碼,這里先使用==進行比較,然后判斷是否為String的一個示例,判斷長度是否相等,最后挨個判斷字符是否相等。

源碼的大部分程序都比較好理解,有些人比較迷惑這里的強制轉(zhuǎn)換(如下圖),既然前一句判斷了是否為String類的實例,后一句為什么還要強轉(zhuǎn)?這是因為,在Java中,代碼從編寫到執(zhí)行要經(jīng)歷兩個過程——編譯和執(zhí)行,在執(zhí)行時,程序判斷了實參是否為String類的實例對象,之后不再需要強轉(zhuǎn);但是在編譯中,即使經(jīng)歷了instanceof判斷,編譯器還是會始終把傳進來的參數(shù)當(dāng)作Object類型,而Object類型是沒有value屬性的,會直接報錯。所以在這里如果不強轉(zhuǎn),編譯都通不過,更不用說執(zhí)行了。

image-20211107203752851

類似的,我們可以寫出Student類中重寫的equals()方法。

不過現(xiàn)在因為類使用的非常多,一方面是因為每個類都添加比較繁瑣,另一方面我們可能寫的可能不夠健壯,這里提供兩種方式自動提供equals()的重寫

IDEA編譯器的快捷鍵“alt + insert”,選擇如下圖的選項

image-20211107195903003

選擇需要添加到equals()的屬性

image-20211107200057910

可以看到自動生成的程序

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age &&
        Objects.equals(name, student.name);
}

導(dǎo)入lombok包,加入Data注解

@Data
public class Student {
    public String name;
    public int age;

    public Student(){}

    public Student(String name, int age){
        this.name = name;
        this.age = age;
    }
}

可以看到重寫了Object類中的equals()方法

image-20211107200459624

3. 總結(jié)

	/**
     * ==是運算符,equals是方法
     * 1. ==
     *      可以使用在基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量中
     *      如果比較的是基本數(shù)據(jù)類型,就是判斷兩個保存的數(shù)據(jù)是否相同,不一定類型相同
     *      如果比較的是引用類型,就是比較兩個變量是否代表同一對象實體,也就是是否指向同一地址
     *
     * 2. equals
     *      只能適用于引用數(shù)據(jù)類型
     *      Object類中equals()和==的作用相同
     *      像String、Data、File、包裝類等中的equals都是重寫了Object類中的equals()方法,比較的是實體內(nèi)容是否相同
     */

到此這篇關(guān)于Java中==和equals()的區(qū)別的文章就介紹到這了,更多相關(guān)Java ==和equals()區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    SpringMVC中@Valid不起效BindingResult讀取不到Error信息

    在寫SpringMVC項目時,由于要對表單數(shù)據(jù)進行校驗,需要使用@Valid進行校驗,但是在進行數(shù)據(jù)校驗時,BindingResult對象無法攔截非法表單數(shù)據(jù),result.hasErrors()無論怎么輸入都會返回false,本文詳細的介紹一下解決方法
    2021-09-09
  • Java用鄰接矩陣存儲圖的示例代碼

    Java用鄰接矩陣存儲圖的示例代碼

    鄰接矩陣通常采用一個一維數(shù)組存儲圖中節(jié)點的信息,采用一個二維數(shù)組存儲圖中節(jié)點之間的鄰接關(guān)系。本文將利用Java實現(xiàn)用鄰接矩陣存儲圖,需要的可以參考一下
    2022-06-06
  • 手把手教你SpringBoot過濾器N種注冊方式

    手把手教你SpringBoot過濾器N種注冊方式

    這篇文章主要介紹了手把手教你SpringBoot過濾器N種注冊方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 實例解析Java設(shè)計模式編程中的適配器模式使用

    實例解析Java設(shè)計模式編程中的適配器模式使用

    本篇文章主要通過實例對適配器模式進行了詳解,需要的朋友可以參考下
    2017-04-04
  • 修改xml文件再也不用重啟項目mybatis-xmlreload方法

    修改xml文件再也不用重啟項目mybatis-xmlreload方法

    這篇文章主要為大家介紹了修改xml文件再也不用重啟項目mybatis-xmlreload,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 面試官問如何啟動Java?線程

    面試官問如何啟動Java?線程

    這篇文章主要介紹了面試官問如何啟動Java?線程,Java?的線程創(chuàng)建和啟動非常簡單,但如果問一個線程是怎么啟動起來的往往并不清楚,甚至不知道為什么啟動時是調(diào)用start(),而不是調(diào)用run()方法呢?下面我們就一起進入文章學(xué)習(xí)這個問題吧
    2021-12-12
  • SpringBoot給類進行賦初值的四種方式

    SpringBoot給類進行賦初值的四種方式

    這篇文章主要介紹了springboot給類進行賦初值的四種方式,并通過代碼示例給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-08-08
  • Spring循環(huán)依賴的解決方法詳解

    Spring循環(huán)依賴的解決方法詳解

    Spring的解決循環(huán)依賴是有前置條件的,要解決循環(huán)依賴我們首先要了解Spring Bean對象的創(chuàng)建過程和依賴注入的方式。依賴注入方式,我之前的博客有所分享,大家可以在看本篇文章之前進行一下小小的回顧
    2022-08-08
  • MyBatis中insert操作返回主鍵的實現(xiàn)方法

    MyBatis中insert操作返回主鍵的實現(xiàn)方法

    在使用MyBatis做持久層時,insert語句默認是不返回記錄的主鍵值,而是返回插入的記錄條數(shù)。這篇文章主要介紹了MyBatis中insert操作返回主鍵的方法,需要的朋友可以參考下
    2016-09-09
  • 九個動畫組圖輪播總結(jié)全棧數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表

    九個動畫組圖輪播總結(jié)全棧數(shù)據(jù)結(jié)構(gòu)數(shù)組鏈表

    數(shù)據(jù)結(jié)構(gòu)和算法是密不可分的,兩者往往是相輔相成的存在,所以在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)過程中,不免會遇到各種算法,數(shù)據(jù)結(jié)構(gòu)常用操作一般為:增刪改查?;旧纤械臄?shù)據(jù)結(jié)構(gòu)都是圍繞這幾個操作進行展開,本文用九張動圖來闡述先進后出的數(shù)據(jù)結(jié)構(gòu)
    2021-08-08

最新評論