Java中“==”與equals方法的區別

来源:http://www.cnblogs.com/jycboy/archive/2016/03/07/5252022.html
-Advertisement-
Play Games

1. 用“==”比較兩個變數,如果兩個變數是基本類型變數,且都是數值類,則值相等就返回true 如果兩個變數是引用型變數,則兩個對象的地址一樣,即指向同一個對象,則返回true 2.equals:String類對equals進行了重寫:1)若是同一個對象,返回true; 2)若不是,則比較它們的值,


1. 用“==”比較兩個變數,如果兩個變數是基本類型變數,且都是數值類,則值相等就返回true

    如果兩個變數是引用型變數,則兩個對象的地址一樣,即指向同一個對象,則返回true

2.equals:String類對equals進行了重寫:1)若是同一個對象,返回true;

                                                       2)若不是,則比較它們的值,值相同,返回true

   重寫代碼:

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;
    }

3.示例:

public class String1 {

    public static void main(String[] args) {
        // TODO 自動生成的方法存根
     
        String str1 = new String("hello");
        String str2 = new String("hello");
        System.out.println("==比較 :"+ (str1 == str2));  //false
        System.out.println("equal比較:"+ str1.equals(str2));
        String str3 = new String("str1");
        String str4 = "str1";
        int hashCode1 = System.identityHashCode(str2);
        System.out.println("str2的地址:"+hashCode1);
        str2 = "str1";
        System.out.println("==比較 :"+ (str3 == str4));  //false
        
        System.out.println("==比較 :"+ (str2 == str3));  
        System.out.println("==比較 :"+ (str2 == str4));  //true
        System.out.println("equal比較:"+ str3.equals(str4));//true
        
        
        int hashCode2 = System.identityHashCode(str2);
        System.out.println("str2的地址:"+hashCode2);
        hashCode2 = System.identityHashCode(str3);
        System.out.println("str3的地址:"+hashCode2);
    }

}

運行結果:

==比較 :false
equal比較:true
str2的地址:1704856573
==比較 :false
==比較 :false
==比較 :true
equal比較:true
str2的地址:705927765
str3的地址:366712642

4.正確重寫equals重新需要註意五點:

   1   自反性:對任意引用值X,x.equals(x)的返回值一定為true. 
   2   對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true; 
   3   傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true 
   4   一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變 
  5   非空性:任何非空的引用值X,x.equals(null)的返回值一定為false 

經過重寫後就跟==有本質的區別了:

equal:是用來比較兩個對象內部的內容是否相等的,由於所有的類都是繼承自java.lang.Object類的,所以如果沒有對該方法進行覆蓋的話,調用
的仍然是Object類中的方法,而Object中的equal方法返回的卻是==的判斷,因此,如果在沒有進行該方法的覆蓋後,調用該方法是沒有
任何意義的。在java面向對象的處理中我們一般在javabean中都要選擇重寫equals方法,使用hibernate後,我們要生成資料庫的映射文件與實體

類,這是我們就最好在實體類中進行equals方法的重寫,重寫時我們可以根據自己的定義來實現該方法只要遵守那五條原則,例如對於一個student類

我們定義只要在學號相同時我們就認為這兩個對象時相等的;同時我們還要重寫hashcode方法。
==:是用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。

參考博客:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章首先走馬觀花瞭解一下程式啟動那一刻都做了些什麼 1 Program StarOfficeMain; 2 3 uses 4 StarOfficeApplication, 5 MainForm in 'Form\MainForm.pas' {frmMain}, 6 StarMainFormInt
  • 最近打算清理掉之前的博客。寫一些關於twisted的框架的文章,twisted是python優秀,成熟,廣泛使用的非同步網路框架;打算從網路基礎開始寫起,到例子,到源碼分析,爭取對twisted有個比較清晰的認識,自己也能再次從中有所收穫。最近比較忙,有空就更新。這是第一篇,想到哪裡寫哪裡,最後再整理
  • 轉載自 https://springframework.guru/mocking-unit-tests-mockito/
  • 在C++的類中,都會有一個或多個構造函數、一個析構函數、一個賦值運算操作符。即使我們自己定義的類中,沒有顯示定義它們,編譯器也會聲明一個預設構造函數、一個析構函數和一個賦值運算操作符。例如: 1 //聲明一個空類 2 class Empty{}; 3 4 //但是這個空類和下麵這個類是等同的 5 c
  • SEVERE: The required Server component failed to start so Tomcat is unable to start. org.apache.catalina.LifecycleException: Failed to start component
  • 觀察者模式介紹 觀察者模式是一種非常有用的設計模式,在軟體系統中,當一個對象的行為依賴於另一個對象的狀態時,觀察者模式就非常有用。如果不適用觀察者模式,而實現類似的功能,可能就需要另外啟動一個線程不停地監聽另一個對象的狀態,這樣會得不償失。如果在一個複雜的系統中,可能就需要開啟很多的線程來監聽對象狀
  • String類的三個內建正則表達式工具: 1.matches()方法 示例:檢查一個句子是否以大寫字母開頭,以句號結尾 1 public static boolean checkFormat(String sentence){ 2 return sentence.matches("^[A-Z].+\
  • 本章主要是講解讀者在進行FPGA邏輯設計之前的準備工作,需要下載Quartus II軟體和 Modelsim 軟體,一個是用來進行FPGA邏輯設計,一個是用來對邏輯進行理論分析與驗證。 1.1 quartus 軟體安裝 現在Quartus II軟體已經更新到了15.0版本,這個最新版本的一些特性如下
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...