欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解java==運算符和equals()方法的區(qū)別

 更新時間:2019年03月20日 12:07:50   作者:冰湖一角  
這篇文章主要介紹了java==運算符和equals()方法的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Java語言程序中判斷兩個變量是否相等有兩種方式:一是運用==運算符,二是運用equals方法。

1. ==運算符

對于==運算符來說,如果兩個變量是基本類型的,并且是數(shù)值類型,則只要它們的值相等,就會返回true;然而如果是兩個引用類型的變量,則分為兩種情況:1)它們指向同一個對象,結(jié)果返回true;2)它們指向不同的對象,即使對象內(nèi)容相同,結(jié)果還是返回false;下面程序示范了使用==運算符比較兩個變量是否相等的結(jié)果:

public class Test {
 public static void main(String[] args) {
  int a = 5;
  int b = 5;
  String s1 = "helloJava";
  String s2 = "helloJava";
  String s3 = "hello"+"Java";
  String s4 = "hello";
  String s5 = "Java";
  String s6 = s4 + s5;
  String s7 = new String("helloJava");
  System.out.println("a==b?: "+(a==b));
  System.out.println("s1==s2?: "+(s1==s2));
  System.out.println("s1==s3?: "+(s1==s3));
  System.out.println("s1==s6?: "+(s1==s6));
  System.out.println("s1==s7?: "+(s1==s7));
  System.out.println("s1.equals(s6)?: "+(s1.equals(s6)));
  System.out.println("s1.equals(s7)?: "+(s1.equals(s7)));
 }
}

運行結(jié)果為:

a==b?: true
s1==s2?: true
s1==s3?: true
s1==s6?: false
s1==s7?: false
s1.equals(s6)?: true
s1.equals(s7)?: true

結(jié)果分析:兩個int類型的a和b相等,不需要多解釋;s1、s2和s3所引用的字符串在編譯期間就已經(jīng)確定下來,因此它們都將引用常量池中的同一個字符串對象;s6對應(yīng)的字符串值不能在編譯期間確定下來;s7使用new構(gòu)造器將會創(chuàng)建一個新的String對象,s7引用堆內(nèi)存中創(chuàng)建的String對象,不在常量池中。(關(guān)于String字符串的創(chuàng)建和存儲機制將在下篇介紹,望大家置頂公眾號,第一時間收看)。

2. equals()方法

equals()方法是Object類提供的一個方法,直接使用這個方法判斷兩個對象相等的標(biāo)準(zhǔn)與使用==運算符沒有區(qū)別,但是怎么樣實現(xiàn)類似于“值相等”的判斷規(guī)則呢?答案是重寫equals方法。

String已經(jīng)重寫了Object的equals()方法,String的equals()方法判斷兩個字符串相等的標(biāo)準(zhǔn)是:如果兩個字符串所包含的字符序列相等,通過equals()方法比較將返回true,否則返回false。

一般而言,重寫equals()方法應(yīng)該滿足下列條件:

1)自反性:對任意x,x.equals(x)一定返回true。
2)對稱性:對任意x,y,如果x.equals(y)返回true,則y.equals(x)也一定返回true。
3)傳遞性:對任意x,y,z,如果x.equals(y)返回true,y.equals(z)也返回true,則x.equals(z)也一定返回true。
4)一致性:對任意x,y,如果對象中用于比較的信息沒有改變,那么無論調(diào)用多少次x.equals(y),返回的結(jié)果應(yīng)該保持一致,要么一直返回true,要么一直返回false。
5)對任意不是null的x,x.equals(null)一定返回false。

實際應(yīng)用中常常需要根據(jù)業(yè)務(wù)本身重寫equals()方法,equals()方法的實現(xiàn)也是由業(yè)務(wù)決定的,下面示范了一種符合實際情況的重寫equals()方法的示例:

public class Person {
 private String name;//姓名
 private int age;//年齡
 private String idNum;//身份證號
 
 public Person() {
  super();
 }
 
 public Person(String name, int age, String idNum) {
  super();
  this.name = name;
  this.age = age;
  this.idNum = idNum;
 }

 //重寫equals方法
 public boolean equals(Object obj){
  //如果兩個對象是同一個對象,返回true
  if(this == obj){
   return true;
  }
  //obj是Person對象
  if(obj!=null && obj.getClass()==Person.class){
   Person p = (Person)obj;
   //并且身份證號相同才判斷兩個對象相等
   if(this.idNum.equals(p.getIdNum())){
    return true;
   }
  }
  return false;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public String getIdNum() {
  return idNum;
 }

 public void setIdNum(String idNum) {
  this.idNum = idNum;
 }

 public static void main(String[] args) {
  Person p1 = new Person("張三", 14, "zs14abc");
  Person p2 = new Person("張三2", 15, "zs14abc");
  Person p3 = new Person("張三", 14, "zs14abc2");
  System.out.println("p1.equals(p2)?: "+(p1.equals(p2)));
  System.out.println("p1.equals(p3)?: "+(p1.equals(p3)));
 }

}

運行結(jié)果:

p1.equals(p2)?: true
p1.equals(p3)?: false

大家都明白了==和equals的區(qū)別和用法了嗎?網(wǎng)上很多說equals()方法是判斷兩個對象的值相等,這個說法并不太準(zhǔn)確,因為你可以重寫equals()方法,你想讓它們怎么相等就怎么相等,在極端情況下你可以讓Person對象個Pig對象相等。

所以為了便于初學(xué)者記憶,可以說==運算符用來比較兩個變量的值是否相等;equals()方法用于比較兩個對象的內(nèi)容是否相同。

以上所述是小編給大家介紹的java==運算符和equals()方法的區(qū)別詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Spring Boot項目打包指定包名實現(xiàn)示例

    Spring Boot項目打包指定包名實現(xiàn)示例

    這篇文章主要為大家介紹了Spring Boot項目打包指定包名實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • web 容器的設(shè)計如何實現(xiàn)

    web 容器的設(shè)計如何實現(xiàn)

    這篇文章主要介紹了web 容器的設(shè)計如何實現(xiàn)的相關(guān)資料,本文旨在介紹如何設(shè)計一個web容器,只探討實現(xiàn)的思路,并不涉及過多的具體實現(xiàn)。把它分解劃分成若干模塊和組件,每個組件模塊負(fù)責(zé)不同的功能,需要的朋友可以參考下
    2016-12-12
  • Java 17 更快的 LTS 節(jié)奏

    Java 17 更快的 LTS 節(jié)奏

    這篇文章主要介紹的是Java 17 更新后的LTS,現(xiàn)在 Java 17 的發(fā)布,讓 Java 11 成了 LTS 系列的次新版本,下面我們就來看看Java 17 的更新 LTS有什么變化吧
    2021-09-09
  • idea編寫yml、yaml文件以及其優(yōu)先級的使用

    idea編寫yml、yaml文件以及其優(yōu)先級的使用

    本文主要介紹了idea編寫yml、yaml文件以及其優(yōu)先級的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Java中雙冒號::的作用舉例詳解

    Java中雙冒號::的作用舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中雙冒號::作用的相關(guān)資料,雙冒號(::)運算符在Java?8中被用作方法引用(method?reference),方法引用是與lambda表達式相關(guān)的一個重要特性,需要的朋友可以參考下
    2023-11-11
  • java?SpringMvc中攔截器的應(yīng)用

    java?SpringMvc中攔截器的應(yīng)用

    大家好,本篇文章主要講的是java?SpringMvc中攔截器的應(yīng)用,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Springboot死信隊列?DLX?配置和使用思路分析

    Springboot死信隊列?DLX?配置和使用思路分析

    死信隊列簡稱就是DLX,死信交換機和死信隊列和普通的沒有區(qū)別,當(dāng)消息成為死信后,如果該隊列綁定了死信交換機,則消息會被死信交換機重新路由到死信隊列,本文給大家介紹Springboot死信隊列?DLX的相關(guān)知識,感興趣的朋友一起看看吧
    2022-03-03
  • IDEA生成項目后出現(xiàn)的iml和idea文件問題

    IDEA生成項目后出現(xiàn)的iml和idea文件問題

    這篇文章主要介紹了IDEA生成項目后出現(xiàn)的iml和idea文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • spring中@autowired、@Qualifier、@Primary注解的使用說明

    spring中@autowired、@Qualifier、@Primary注解的使用說明

    這篇文章主要介紹了spring中@autowired、@Qualifier、@Primary注解的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 淺談Java中的hashcode方法(推薦)

    淺談Java中的hashcode方法(推薦)

    本篇文章主要介紹了Java中的hashcode方法,詳細(xì)的介紹了hashCode方法的作用,具有一定的參考價值,有需要的可以了解一下。
    2016-12-12

最新評論