AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

Java中equals和==的區別

來源: 責編: 時間:2023-10-13 14:36:42 226觀看
導讀equal和==== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。equals用來比較的是兩個對象的內容是否相等,由于所有的類都是繼

equal和==

== 比較的是變量(棧)內存中存放的對象的(堆)內存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。U9o28資訊網——每日最新資訊28at.com

equals用來比較的是兩個對象的內容是否相等,由于所有的類都是繼承自java.lang.Object類的,所以適用于所有對象,如果沒有對該方法進行覆蓋的話,調用的仍然是Object類中的方法,而Object中的equals方法返回的卻是==的判斷。U9o28資訊網——每日最新資訊28at.com

基本數據類型

byte,short,char,int,long,float,double,boolean基本數據類型之間的比較需要用雙等號(==),因為他們比較的是值。U9o28資訊網——每日最新資訊28at.com

引用數據類型

接口、類、數組等非基本數據類型,Java中的字符串String屬于引用數據類型。U9o28資訊網——每日最新資訊28at.com

當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結果為true,否則比較后結果為false。因為沒new一次就會重新開辟一個新的堆內存空間。U9o28資訊網——每日最新資訊28at.com

Java中的==

==

Java中的==表示的是什么呢?有時候很令人費解。比如,以下例子輸出是什么?U9o28資訊網——每日最新資訊28at.com

// 例一String str = "wo";String str1 = "wo";System.out.println("例一:" + (str == str1));// 例二String str2 = new String("wo");String str3 = new String("wo");System.out.println("例二:" + (str2 == str3));// 例三int i1 = 1;int i2 = 1;System.out.println("例三:" + (i1 == i2));// 例四TestObject t1 = new TestObject();TestObject t2 = new TestObject();System.out.println("例四:" + (t1 == t2));

最終結果如下:U9o28資訊網——每日最新資訊28at.com

例一:true例二:false例三:true例四:false

在Java中,如果是基本數據類型,則 == 比較的是值;如果是對象類型,則 == 比較的是對象的地址。但是,有時候會疑惑,String不是對象類型么?為什么例一是true呢?這個就要談談字符串常量池的問題。U9o28資訊網——每日最新資訊28at.com

字符串常量池

String類是我們平常項目中使用頻率非常高的一種對象類型,JVM為了提升性能和減少開銷,避免字符串的重復創建,維護了一塊特殊的內存空間,即字符串常量池。當需要使用字符串時,先去字符串常量池查看該字符串是否已經存在,如果存在,則可直接使用;如果不存在,初始化,并將該字符串放入到字符串常量池中。U9o28資訊網——每日最新資訊28at.com

「注意」:在JDK1.6及之前版本,字符串常量池在方法區中 在JDK1.7及以后版本,字符串常量池移到了堆中。U9o28資訊網——每日最新資訊28at.com

使用String str="wo",可能創建一個或者不創建對象。如果“wo”在字符串常量池中已經存在,則不會再創建String類型的值為“wo”的對象,而是將str指向這個“wo”對象內存地址,后續無論用這種方式創建多少個指向“wo”的引用,在內存中,都只有一個“wo”內存地址被分配。而==判斷的是對象內存的地址,所以例一返回true。下圖是用這種方式創建字符串的示例圖。U9o28資訊網——每日最新資訊28at.com

圖片圖片U9o28資訊網——每日最新資訊28at.com

對象存放在堆中,字符串常量池是堆中一塊特殊區域,new出來的是對象,字符串可以通過直接賦值創建一個對象,如上所述。對象的引用存放在棧中,String str是對象的引用。U9o28資訊網——每日最新資訊28at.com

在上圖中,棧存放的是字符串的引用,str和str1存放的都是對象“wo”的內存地址,==判斷對象時,判斷的是他們存儲的內存地址是否相同,由上圖可見,他們的內存地址是相同的,所以例一輸出的是true。U9o28資訊網——每日最新資訊28at.com

圖片圖片U9o28資訊網——每日最新資訊28at.com

例二的兩個字符串都是通過new的方式創建對象的,所以在堆上有兩個String對象,且這兩個對象指向字符串常量池中的同一個對象“wo”,如上圖所示,此時str2和str3存儲的對象地址就不相同,所以例二返回的是false。U9o28資訊網——每日最新資訊28at.com

String str = new String("wo")創建了幾個對象?如果字符串常量池中沒有“wo”,則該句創建了兩個對象,首先會創建一個“wo”存放在字符串常量池中,其本身就是一個對象;然后會new 一個字符串對象,并將“wo”的引用返回給new出來的對象;如果字符串常量池中有“wo”,則該句只創建了一個對象,因為該句首先會查找字符串常量池中是否存在“wo”,如果存在則直接返回"wo"的引用給new出來的對象。U9o28資訊網——每日最新資訊28at.com

總結

  • 如果是基本數據類型,==判斷的是值。
  • 如果是對象類型,==判斷的是對象的地址。
  • 通過直接賦值而不是new的方式給String賦值,如果字符串常量池中有該對象,則不會再創建,此時通過 == 判斷,返回的是true。如:String str="wo";String str1="wo";str == str1為true。
  • 在JDK1.6及以前版本,字符串常量池在方法區中;在JDK1.7及以后,字符串常量池在堆中。
  • 對象的引用保存在棧中。

Java中equals()

Java中所有的類都是繼承與Object這個基類的,在Object類中定義了一個equals方法,這個方法的初始行為是比較對象的內存地址,但在一些類庫中已經重寫了這個方法(一般都是用來比較對象的成員變量值是否相同),比如:String,Integer,Date 等類中,所以他們不再是比較類在堆中的地址。U9o28資訊網——每日最新資訊28at.com

public boolean equals(Object var1) {    return this == var1;}

String類的equals()方法

String類中重寫后的代碼:U9o28資訊網——每日最新資訊28at.com

public boolean equals(Object var1) {    if (this == var1) {        return true;    } else {        if (var1 instanceof String) {            String var2 = (String)var1;            int var3 = this.value.length;            if (var3 == var2.value.length) {                char[] var4 = this.value;                char[] var5 = var2.value;                for(int var6 = 0; var3-- != 0; ++var6) {                    if (var4[var6] != var5[var6]) {                        return false;                    }                }                return true;            }        }        return false;    }}

示例:U9o28資訊網——每日最新資訊28at.com

// abc在常量池中String a = "abc";// 棧中b指向常量池中的abcString b = "abc";// 在堆內存中重新開辟了一個abc的空間String c = new String("abc");//檢查字符串池里是否存在"abc"這么一個字符串,如果存在,就返回池里的字符串;如果不存在,該方法會 把"abc"添加到字符串池中,然后再返回它的引用。String d = c.intern();        System.out.println(a==b);System.out.println(a.equals(b));System.out.println(a==c);System.out.println(a.equals(c));System.out.println(a==d);System.out.println(a.equals(d));

運行結果:U9o28資訊網——每日最新資訊28at.com

truetruefalsetruetruetrue

equals的作用

引用類型:默認情況下,比較的是地址值,重寫該方法后比較對象的成員變量值是否相同。U9o28資訊網——每日最新資訊28at.com

總結

對于復合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內存中的存放位置的地址值,跟雙等號(==)的結果相同;如果被復寫,按照復寫的實現來進行比較。U9o28資訊網——每日最新資訊28at.com


U9o28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-13524-0.htmlJava中equals和==的區別

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 通過線程池方式改造Stream.parallel()并行流

下一篇: 面試中如何答好:synchronized

標簽:
  • 熱門焦點
  • Mate60手機殼曝光 致敬自己的經典設計

    8月3日消息,今天下午博主數碼閑聊站帶來了華為Mate60的第三方手機殼圖,可以讓我們在真機發布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 一篇文章帶你了解 CSS 屬性選擇器

    屬性選擇器對帶有指定屬性的 HTML 元素設置樣式??梢詾閾碛兄付▽傩缘?HTML 元素設置樣式,而不僅限于 class 和 id 屬性。一、了解屬性選擇器CSS屬性選擇器提供了一種簡單而
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業從業者、長三角一體化擁護者”的微博用戶 @長三角行健者 發文表示,據經銷商集團反饋,小米汽車目前
  • 三星Galaxy Z Fold5官方渲染圖曝光:13.4mm折疊厚度依舊感人

    據官方此前宣布,三星將于7月26日在韓國首爾舉辦Unpacked活動,屆時將帶來帶來包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy Z Flip 5、
  • iQOO Neo8系列或定檔5月23日:首發天璣9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列機型,不僅搭載了天璣9000+,而且是同價位唯一一款天璣9000+直屏旗艦,一經上市便受到了用戶的廣泛關注。在時隔半年后,
  • 親歷馬斯克血洗Twitter,硅谷的苦日子在后頭

    文/劉哲銘  編輯/李薇  馬斯克再次揮下裁員大刀?! ∶绹鴷r間11月14日,Twitter約4400名外包員工遭解雇,此次被解雇的員工的主要工作為內容審核等。此前,T
Top