官术网_书友最值得收藏!

細節8 含義不同——使用“==”與equals比較對象

可以使用關系相等運算符“==”和對象的equals ()方法比較對象,但是在比較對象時,兩者是有區別的。

· 關系相等運算符“==”

當使用關系相等運算符“==”比較對象時,比較的是對象的引用是否相同,如果對象的引用相同,則比較的結果就為true,否則比較的結果就為false。

· 對象的equals ()方法

當使用對象的equals ()方法比較對象時,是比較對象的內容(即對象的值)是否相同,而不是比較對象的引用,所以只要兩個對象的內容相同,則使用equals ()方法比較的結果就為true,否則比較的結果就為false。

示例:

    String x = new String ("Java");          // 創建String對象x,其值是Java
    String y = new String ("Java");          // 創建String對象y,其值也是Java

上面的代碼創建了兩個String對象x和y,它們的內容在內存中被存儲到不同的位置,如圖5.11所示。

圖5.11 對象x和y的內存分布

對如圖5.11所示的兩個對象x和y使用關系相等運算符“==”與對象的equals ()方法進行比較,其結果是不同的,示例如下:

    String x = new String ("Java");           // 創建String對象x,其值是Java
    String y = new String ("Java");           // 創建String對象y,其值也是Java
    System. out. println (x==y);                // 用關系相等比較對象x和y
    System. out. println (x. equals (y));         // 用對象的equals ()方法比較對象x和y

本示例運行后將輸出如下兩行信息:

    false
    true

說明

通過本示例的輸出結果可以看出,對于如圖5.11中所示的兩個對象x和y,通過關系相等運算符“==”進行比較的結果為false,這也充分說明關系相等運算符“==”比較的是對象的引用,雖然對象x和y的內容相同,但是由于引用不同,所以認為x和y是兩個不同的對象;而用對象的equals ()方法比較的結果為true,這也充分地說明了對象的equals ()方法比較的是對象的內容,而與對象的引用無關。

接下來再看一個示例:

    String x = "Java";                   // 創建String對象x,其值是Java
    String y = "Java";                   // 創建String對象y,其值也是Java

上面的代碼創建了兩個String對象x和y,它們的內容在內存中存儲在相同的位置,也就是同一個對象,就好比兩個人住在同一個房子中,如圖5.12所示。

圖5.12 對象x和y的內存分布

對如圖5.12中所示的兩個對象x和y使用關系相等運算符“==”與對象的equals ()方法進行比較,其結果都是真值true,代碼如下:

    String x = "Java";                   // 創建String對象x,其值是Java
    String y = "Java";                   // 創建String對象y,其值也是Java
    System. out. println (x==y);            // 用關系相等比較對象x和y
    System. out. println (x. equals (y));     // 用對象的equals ()方法比較對象x和y

本示例運行后將輸出如下兩行信息:

    true
    true

說明

本示例輸出的兩行信息之所以都是真值true,是因為這兩個對象的引用與內容都相同,所以無論使用的是關系相等運算符“==”,還是對象的equals ()方法,其比較結果都為真值true,這樣創建的兩個對象x和y之所以相同,是因為將相同的字符串常量賦值給不同的字符串變量時,使用了緩存數據,所以這兩個對象的引用與內容是完全相同的。

提示

String類使用的equals ()方法比較的是字符串的內容是否相同,這是由于String類重寫了Object類的equals ()方法,而Object類的equals ()方法則是比較對象的引用是否相同,所以當需要比較其他對象時,可以通過重寫Object類的equals ()方法來定制如何比較對象。

主站蜘蛛池模板: 合山市| 宾川县| 涟水县| 通城县| 安西县| 东乌珠穆沁旗| 哈密市| 泰州市| 永年县| 邮箱| 富民县| 昭通市| 海门市| 出国| 行唐县| 中牟县| 福鼎市| 杭锦旗| 天全县| 通河县| 名山县| 长白| 宁海县| 西畴县| 永寿县| 绥化市| 济宁市| 台东市| 武夷山市| 小金县| 芜湖市| 岑溪市| 清苑县| 昌图县| 吕梁市| 长阳| 萨迦县| 河西区| 洞头县| 太谷县| 灵台县|