1. 程式人生 > >Java中equals和==的解析

Java中equals和==的解析

實現 sting 應用 告訴 strong str intern println 不存在

java中的數據類型,可分為兩類:
1.基本數據類型,也稱原始數據類型。byte,short,char,int,long,float,double,boolean
他們之間的比較,應用雙等號(==),比較的是他們的值。
2.復合數據類型(類)
(1)當他們用==進行比較的時候,比較的是他們在內存中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果為true,否則比較後結果為false。 JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內存地址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。
(2)對於復合數據類型

之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較後的結果跟雙等號(==)的結果相同。

3. 字符串緩沖池
(1) 原來,程序在運行的時候會創建一個字符串緩沖池當使用 param2_1 = "lowi" 這樣的表達是創建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象,param2_1先被放到了池中,所以在param2_1被創建的時候,程序找到了具有相同值的 param1_1
將s2引用s1所引用的對象"Monday"
(2)使用了 new 操作符,他明白的告訴程序:"我要一個新的!不要舊的!"於是一個新的"lowi"Sting對象被創建在內存中。他們的值相同,但是位置不同,一個在池中遊泳一個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什麽呢?

4.java.lang.String的intern()方法

java.lang.String的intern()方法"lowi".intern()方法的返回值還是字符串"lowi",表面上看起來好像這個方法沒什麽用處。

實際上,做了一個程序處理:檢查字符串池裏是否存在"lowi"這麽一個字符串,如果存在,就返回池裏的字符串;如果不存在,該方法會 把"lowi"添加到字符串池中,然後再返回它的引用。

代碼詳細如下:

public class TestEquals {
    public static void main(String[] args) {
        
//該種方式創建的對象params1_1與params2_1,因為值相同,所以只在內存中存放一處 String params1_1="lowi"; String params2_1="lowi"; //該種方式創建的對象params1_2與params2_2, //通過new方式創建的對象,如Sting對象被創建在內存中,他們的值相同,但是位置不同 String params1_2=new String("lowi"); String params2_2=new String("lowi"); //比較使用“” if(params1_1==params2_1){ System.out.println("params1_1==params2_1"); }else{ System.out.println("params1_1!=params2_1"); } if(params1_1.equals(params2_1)){ System.out.println("params1_1與params2_1,equals"); }else{ System.out.println("params1_1與params2_1,not equals"); } /** //結果一 params1_1==params2_1 params1_1與params2_1,equals **/ //比較使用“”與new對象:一 if(params1_1==params1_2){ System.out.println("params1_1==params1_2"); }else{ System.out.println("params1_1!=params1_2"); } if(params1_1.equals(params1_2)){ System.out.println("params1_1與params1_2,equals"); }else{ System.out.println("params1_1與params1_2,not equals"); } /** //結果二 params1_1!=params1_2 params1_1與params1_2,equals */ //比較使用new創建對象 if(params1_2==params2_2){ System.out.println("params1_2==params2_2"); }else{ System.out.println("params1_2!=params2_2"); } if(params1_2.equals(params2_2)){ System.out.println("params1_2與params2_2,equals"); }else{ System.out.println("params1_2與params2_2,not equals"); } /** //結果三 params1_2!=params2_2 params1_2與params2_2,equals */ //比較使用new創建對象:二 //java.lang.String方法intern,用於檢查字符串池裏是否存在"lowi"這麽一個字符串,如果存在,就返回池裏的字符串; //如果不存在,該方法會 把"lowi"添加到字符串池中,然後再返回它的引用。 params2_2 = params2_2.intern(); if(params2_1==params2_2){ System.out.println("params2_1==params2_2"); }else{ System.out.println("params2_1!=params2_2"); } if(params2_1.equals(params2_2)){ System.out.println("params2_1與params2_2,equals"); }else{ System.out.println("params2_1與params2_2,not equals"); } /** //結果四 params2_1==params2_2 params2_1與params2_2,equals */ } }

Java中equals和==的解析