java中測試對象的等價性,java中測試對象的等價性是什麼

本文目錄一覽:

在java的集合中是怎麼判斷兩個對象是否相等的

先判斷兩個對象的hashcode()是否相等,再判斷equals()是否相等,都相等則相等。

PS:最終決定兩個對象是否相等的是equals(),hashcode()的存在只是比較的效率了,沒有hashcode()比較的會慢;equals()是判斷的唯一標準,hashcode()是判斷的更快

java 中如何比較兩個數組對象的內容是否相等?急

char[] a = {‘a’, ‘b’};

char[] b = {‘a’, ‘f’};

String sa = String.valueOf(a);

String sb = String.valueOf(b);

if( sa.equals(sb) )

System.out.println(“兩個數組相等”);

else

System.out.println(“兩個數組不相等”);

在Java中,共有多少種方法可以用來判斷兩個對象相等?有具體的實現代碼是最好的!

1. 首先String不屬於8種基本數據類型,String是一個對象。

因為對象的默認值是null,所以String的默認值也是null;但它又是一種特殊的對象

,有其它對象沒有的一些特性。

2. new String()和new String(“”)都是申明一個新的空字符串,是空串不是null;

3. String str=”kvill”;

String str=new String (“kvill”);的區別:

在這裡,我們不談堆,也不談棧,只先簡單引入常量池這個簡單的概念。

常量池(constant pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的

一些數據。它包括了關於類、方法、接口等中的常量,也包括字符串常量。

看例1:

String s0=”kvill”;

String s1=”kvill”;

String s2=”kv” + “ill”;

System.out.println( s0==s1 );

System.out.println( s0==s2 );

結果為:

true

true

首先,我們要知道Java會確保一個字符串常量只有一個拷貝。

因為例子中的s0和s1中的”kvill”都是字符串常量,它們在編譯期就被確定了,所以

s0==s1為true;而”kv”和”ill”也都是字符串常量,當一個字符串由多個字符串常量連

接而成時,它自己肯定也是字符串常量,所以s2也同樣在編譯期就被解析為一個字符串常

量,所以s2也是常量池中”kvill”的一個引用。

所以我們得出s0==s1==s2;

用new String() 創建的字符串不是常量,不能在編譯期就確定,所以new String()

創建的字符串不放入常量池中,它們有自己的地址空間。

看例2:

String s0=”kvill”;

String s1=new String(”kvill”);

String s2=”kv” + new String(“ill”);

System.out.println( s0==s1 );

System.out.println( s0==s2 );

System.out.println( s1==s2 );

結果為:

false

false

false

例2中s0還是常量池中”kvill”的應用,s1因為無法在編譯期確定,所以是運行時創

建的新對象”kvill”的引用,s2因為有後半部分new String(“ill”)所以也無法在編譯

期確定,所以也是一個新創建對象”kvill”的應用;明白了這些也就知道為何得出此結果

了。

4. String.intern():

再補充介紹一點:存在於.class文件中的常量池,在運行期被JVM裝載,並且可以擴充

。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern(

)方法時,Java查找常量池中是否有相同Unicode的字符串常量,如果有,則返回其的引用

,如果沒有,則在常量池中增加一個Unicode等於str的字符串並返回它的引用;看例3就清

楚了

例3:

String s0= “kvill”;

String s1=new String(”kvill”);

String s2=new String(“kvill”);

System.out.println( s0==s1 );

System.out.println( “**********” );

s1.intern();

s2=s2.intern(); //把常量池中“kvill”的引用賦給s2

System.out.println( s0==s1);

System.out.println( s0==s1.intern() );

System.out.println( s0==s2 );

結果為:

false

**********

false //雖然執行了s1.intern(),但它的返回值沒有賦給s1

true //說明s1.intern()返回的是常量池中”kvill”的引用

true

最後我再破除一個錯誤的理解:

有人說,“使用String.intern()方法則可以將一個String類的保存到一個全局Strin

g表中,如果具有相同值的Unicode字符串已經在這個表中,那麼該方法返回表中已有字符

串的地址,如果在表中沒有相同值的字符串,則將自己的地址註冊到表中“如果我把他說

的這個全局的String表理解為常量池的話,他的最後一句話,“如果在表中沒有相同值的

字符串,則將自己的地址註冊到表中”是錯的:

看例4:

String s1=new String(“kvill”);

String s2=s1.intern();

System.out.println( s1==s1.intern() );

System.out.println( s1+” “+s2 );

System.out.println( s2==s1.intern() );

結果:

false

kvill kvill

true

在這個類中我們沒有聲名一個”kvill”常量,所以A砍刂幸豢 際敲揮小眐vill”的

,當我們調用s1.intern()後就在常量池中新添加了一個”kvill”常量,原來的不在常量

池中的”kvill”仍然存在,也就不是“將自己的地址註冊到常量池中”了。

s1==s1.intern()為false說明原來的“kvill”仍然存在;

s2現在為常量池中“kvill”的地址,所以有s2==s1.intern()為true。

5. 關於equals()和==:

這個對於String簡單來說就是比較兩字符串的Unicode序列是否相當,如果相等返回t

rue;而==是比較兩字符串的地址是否相同,也就是是否是同一個字符串的引用。

6. 關於String是不可變的

這一說又要說很多,大家只要知道String的實例一旦生成就不會再改變了,比如說:

String str=”kv”+”ill”+” “+”ans”;

就是有4個字符串常量,首先”kv”和”ill”生成了”kvill”存在內存中,然後”kvill

”又和” “ 生成 ”kvill “存在內存中,最後又和生成了”kvill ans”;並把這個字符

串的地址賦給了str,就是因為String的“不可變”產生了很多臨時變量,這也就是為什麼

建議用StringBuffer的原因了,因為StringBuffer是可改變的

java中用==比較對象時是不是調用object的equal方法

不是

值類型(int,char,long,boolean等)都是用==判斷相等性。對象引用的話,==判斷引用所指的對象是否是同一個。equals是Object的成員函數,有些類會覆蓋(override)這個方法,用於判斷對象的等價性。例如String類,兩個引用所指向的String都是”abc”,但可能出現他們實際對應的對象並不是同一個(和jvm實現方式有關),因此用==判斷他們可能不相等,但用equals判斷一定是相等的。另一個類似的例子是BigInteger。總體來說要搞清楚,還是需要先理解清楚對象實體和引用之間的關係。

原創文章,作者:EGET,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/132728.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EGET的頭像EGET
上一篇 2024-10-03 23:54
下一篇 2024-10-03 23:54

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論