轉載------------java equals 方法

作者:海子
出處:http://www.cnblogs.com/dolphin0520/

淺談Java中的equals和==

  在初學Java時,可能會經常碰到下面的代碼:

1 String str1 = new String("hello");
2 String str2 = new String("hello");
3         
4 System.out.println(str1==str2);
5 System.out.println(str1.equals(str2));

  為什么第4行和第5行的輸出結果不一樣?==和equals方法之間的區別是什么?如果在初學Java的時候這個問題不弄清楚,就會導致自己在以后編寫代碼時出現一些低級的錯誤。今天就來一起了解一下==和equals方法的區別之處。

一.關系操作符“==”到底比較的是什么?

  下面這個句話是摘自《Java編程思想》一書中的原話:

  “關系操作符生成的是一個boolean結果,它們計算的是操作數的值之間的關系”。

  這句話看似簡單,理解起來還是需要細細體會的。說的簡單點,==就是用來比較值是否相等。下面先看幾個例子:

復制代碼
public class Main {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubint n=3;int m=3;System.out.println(n==m);String str = new String("hello");String str1 = new String("hello");String str2 = new String("hello");System.out.println(str1==str2);str1 = str;str2 = str;System.out.println(str1==str2);}}
復制代碼

  輸出結果為 true false true

  n==m結果為true,這個很容易理解,變量n和變量m存儲的值都為3,肯定是相等的。而為什么str1和str2兩次比較的結果不同?要理解這個其實只需要理解基本數據類型變量和非基本數據類型變量的區別。

  在Java中游8種基本數據類型:

  浮點型:float(4 byte), double(8 byte)

  整型:byte(1 byte), short(2 byte), int(4 byte)?, long(8 byte)

  字符型: char(2 byte)

  布爾型: boolean(JVM規范沒有明確規定其所占的空間大小,僅規定其只能夠取字面值"true"和"false")

  對于這8種基本數據類型的變量,變量直接存儲的是“值”,因此在用關系操作符==來進行比較時,比較的就是?“值” 本身。要注意浮點型和整型都是有符號類型的,而char是無符號類型的(char類型取值范圍為0~2^16-1).

  也就是說比如:

  int n=3;

  int m=3; 

  變量n和變量m都是直接存儲的"3"這個數值,所以用==比較的時候結果是true。

  而對于非基本數據類型的變量,在一些書籍中稱作為 引用類型的變量。比如上面的str1就是引用類型的變量,引用類型的變量存儲的并不是 “值”本身,而是于其關聯的對象在內存中的地址。比如下面這行代碼:

  String str1;

  這句話聲明了一個引用類型的變量,此時它并沒有和任何對象關聯。

  而 通過new String("hello")來產生一個對象(也稱作為類String的一個實例),并將這個對象和str1進行綁定:

  str1= new String("hello");

  那么str1指向了一個對象(很多地方也把str1稱作為對象的引用),此時變量str1中存儲的是它指向的對象在內存中的存儲地址,并不是“值”本身,也就是說并不是直接存儲的字符串"hello"。這里面的引用和C/C++中的指針很類似。

  因此在用==對str1和str2進行第一次比較時,得到的結果是false。因此它們分別指向的是不同的對象,也就是說它們實際存儲的內存地址不同。

  而在第二次比較時,都讓str1和str2指向了str指向的對象,那么得到的結果毫無疑問是true。

二.equals比較的又是什么?

  equals方法是基類Object中的方法,因此對于所有的繼承于Object的類都會有該方法。為了更直觀地理解equals方法的作用,直接看Object類中equals方法的實現。

  該類的源碼路徑為:C:\Program Files\Java\jdk1.6.0_14的src.zip 的java.lang路徑下的Object.java(視個人jdk安裝路徑而定)。

  下面是Object類中equals方法的實現:

  

  很顯然,在Object類中,equals方法是用來比較兩個對象的引用是否相等,即是否指向同一個對象。

  但是有些朋友又會有疑問了,為什么下面一段代碼的輸出結果是true?

復制代碼
public class Main {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubString str1 = new String("hello");String str2 = new String("hello");System.out.println(str1.equals(str2));}
}
復制代碼

  要知道究竟,可以看一下String類的equals方法的具體實現,同樣在該路徑下,String.java為String類的實現。

  下面是String類中equals方法的具體實現:

  可以看出,String類對equals方法進行了重寫,用來比較指向的字符串對象所存儲的字符串是否相等。

  其他的一些類諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的對象所存儲的內容是否相等。

  總結來說:

  1)對于==,如果作用于基本數據類型的變量,則直接比較其存儲的 “值”是否相等;

    如果作用于引用類型的變量,則比較的是所指向的對象的地址

  2)對于equals方法,注意:equals方法不能作用于基本數據類型的變量

    如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的地址;

    諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的內容。

轉載于:https://www.cnblogs.com/ct-blog/articles/5605547.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271590.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271590.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271590.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機系統基礎:校驗碼知識筆記

1、校驗碼概念 校驗碼主要是為了解決計算機各部件進行數據傳輸和交換,確保傳送過程的正確無誤,一是為了提高硬件電路的可靠性,二是提高代碼的校驗能力。通常會用校驗碼來檢查傳送的數據是否正確。 校驗碼編碼分為兩類:合法編碼、錯…

qml與HTML數據交互,GitHub - toby20130333/QtQuickHtmlBridge: 基于QtQuick的C++,qml,Html三者的Bridge交互...

基于QtQuick的C,qml,Html三者的Bridge交互主要功能自定義C對象并注冊到QML可以在QML中繼續擴展C對象的屬性和方法 信號等將C對象注入到WebChannelHtml中引入C對象JavaScript與C直接交互示例代碼說明main.cpp://該實例必須直接繼承自Object的 QWidget的忽略qmlRegisterType(&quo…

html為什么要進行表單驗證_化學錨栓為什么要進行拉拔試驗?

點擊箭頭處“藍色字”,關注我們哦!!化學錨栓是繼膨脹錨栓之后出現的一種新型緊固材料,由化學藥劑與金屬桿體組成,是通過特制的化學粘接劑,將螺桿膠結固定于砼基材鉆孔中,以實現對固定件錨固的復…

電路基礎知識講解(太全面了)

IT技術分享社區個人博客網站:https://programmerblog.xyz文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基…

github設置倉庫可見性 私人倉庫設置

一:點擊Setting 二:點擊Make private 三:閱讀關于將倉庫設為私有的警告。 入您要設為私有的倉庫的名稱,例如 accountname/reponame。 單擊 I understand, make this repository private(我已了解,請將此倉庫設為私有)

Git合并分支操作

1. 添加自己的文件 git add .; 2. 緩存自己的文件 git stash; 3. 查看狀態 git status; 4. 獲取別的分支 git pull origin master(分支名); 5. 出棧自己的文件 git stash pop 。 轉載于:https://www.cnblogs.com/csl0910/p/5605868.html

html鼠標懸停區域拉伸,html – :將鼠標懸停在具有邊框半徑的div上

這里的問題是子元素不繼承父元素的border-radius.有兩種方法可以實現您想要的:您可以將子元素的border-radius設置為匹配或大于父元素的radius,或者將父元素的overflow屬性設置為hidden.這是一個快速的片段,說明了問題和兩個解決方案:*{box-sizing:borde…

rfid在高速公路管理中的應用_RFID技術與ETC技術在弱電門禁系統中應用

前言:無線射頻識別技術(RFID技術)較早的大規模的綜合應用,發展至今,我國的RFID技術已經較為成熟。 相關技術1、無線射頻識別 RFID(Radio Frequency Identification,無線射頻識別)是一種非接觸式的自動識別技術,它通過射…

Idea中Terminal中git基本操作

列出分支 列出分支基本命令:git branch 沒有參數時,git branch 會列出你在本地的分支。 上圖的意思就是,我們有一個叫做 master 的分支,并且該分支是當前分支(有*星號的)。 當你執行 git init 的時候,默認情況下 Gi…

計算機體系結構知識筆記

計算機體系結構結構:計算機的概念結構、功能和性能特性,它從一個更高的層次對計算機的結構特征等宏觀特征進行研究。 1、計算機體系結構分類 2、CISC和RISC 指令體系結構(ISA):一個處理器支持的指令和指令的字節級編碼…

java類的加載機制

一、什么是類的加載 類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的加載的最終產品是位于堆區中的Class對象&…

HttpServletRequestWrapper、HttpServletResponseWrapper結合 過濾器 實現接口的加解密、國際化

目錄 一、HttpServletRequestWrapper代碼 二、HttpServletRequestWrapper代碼 三、加解密過濾器代碼 四、國際化過濾器代碼 一、HttpServletRequestWrapper代碼 package com.vteam.uap.security.httpWrapper;import jakarta.servlet.ReadListener; import jakarta.servlet.…

razor 寫入html標記,如何在Razor中編寫“ Html.BeginForm”

泛舟湖上清波郎朗以下代碼可以正常工作:using (Html.BeginForm("Upload", "Upload", FormMethod.Post, new { enctype "multipart/form-data" })){ Html.ValidationSummary(true) …

windows安全模式_Winclone 8 for Mac(Windows分區備份遷移和還原工具)

winclone 8 Mac版是一款專業的boot Camp遷移助手,能夠將你的PC移動到你的Mac中,讓你實現win系統的遷移。winclone Mac版可以將Bootcamp分區安裝的windows進行克隆也可將克隆文件傳回Bootcamp分區。并且操作簡單。你只需要通過幾次點擊,就能快…

IDEA中一個被低估的功能,一鍵把項目代碼繪制成UML類圖

閱讀本文大概需要 2 分鐘。來自:blog.csdn.net/hy_coming/article/details/80741717最近在開發的過程當中,對于已有的代碼,想將相關類繪制成UML類圖,雖然現在有很多UML類圖的優秀軟件,比如ProcessOn(可視化…

java導出生成word(類似簡歷導出)

最近做的項目,需要將一些信息導出到word中。在網上找了好多解決方案,現在將這幾天的總結分享一下。 目前來看,java導出word大致有6種解決方案: 1:Jacob是Java-COM Bridge的縮寫,它在Java與微軟的COM組件之間…

計算機基礎:存儲系統知識筆記(一)

1、存儲系統定義 由一個不同容量、成本和訪問時間的存儲結構構成的層次結構,這些存儲器通過適當的硬件和軟件有機的組合在一起。 存儲器的層次:CPU內部的寄存器、高速緩存Cache、主存儲器、輔助存儲器 2、存儲器的分類 2.1 存儲位置分類 內存&#xff1a…

html5和c3屬性,H5與C3不得不說的知識點

1 HTML 5html5包含htm5 css3 javascript1.1 新增語義標簽頭部導航欄塊級內容側邊欄腳部注意:可以多次使用;ie9中需要轉換為塊級元素;針對搜索引擎;針對于移動端;1.2 新增多媒體標簽1.2.1 音頻標簽 audio格式&#xf…

ae繪圖未指定錯誤怎么辦_早晨深化設計研究院47個快捷鍵50個CAD技巧助你神速繪圖,玩轉CAD...

終于知道為什么別人用CAD總比我快了,原來他們早就掌握了這些實用的CAD技巧,還沒看完我就默默地轉了,總有用得到的時候。一、47個快捷鍵1. 創建直線的快捷方式是L空格2. 創建圓的快捷方式是C空格3. 創建圓弧的快捷方式是A空格4. 創建矩形的快捷…

iOS項目架構 小談

層級結構,自底向上 持久層(File,Realm,SQLite)<>網絡層(相信每個公司都有自己的網絡層吧)>業務層(ViewModel)>展示層(View,VC) 持久層 耦合到網絡層 設計要點 持久模型的選擇&#xff0c;我這里選擇了文件&#xff0c;直接緩存了JSON.txt。并且維護一張表映射到文件…