java String類常量池分析及"equals"和"==”區別詳細介紹_java

來源:互聯網
上載者:User

java "equals"和"==”異同

首先簡單說一下“equal”和“==”

==操作對於基礎資料型別 (Elementary Data Type)比較的是兩個變數的值是否相等,

對於引用型變數表示的是兩個變數在堆中儲存的地址是否相同,

即棧中的內容是否相同

equals動作表示的兩個變數是否是對同一個對象的引用,

即堆中的內容是否相同。

綜上,==比較的是2個對象的地址,而equals比較的是2個對象的內容。

再簡單介紹一下String類

String類 又稱作不可變字元序列

String使用private final char value[]來實現字串的儲存,也就是說String對象建立之後,就不能再修改此對象中儲存的字串內容。String類有一個特殊的建立方法,就是使用""雙引號來建立。例如new String("123")實際建立了2個String對象,一個是"123"通過""雙引號建立的,另一個是通過new建立的.只不過他們建立的時期不同,一個是編譯期,一個是運行期。java對String類型重載了+操作符,可以直接使用+對兩個字串進行串連。運行期調用String類的intern()方法可以向String Pool中動態添加對象。

區分兩種建立String對象的方法“”和new()

String是一個特殊的封裝類資料。可以用:

String str1 = new String("123");String str2 = "123";

兩種的形式來建立

第一種是用new()來建立對象的,它會在存放於堆中。每調用一次就會建立一個新的對象。(實際是兩個正如上文所說,但是在常量池中存在“123”後就不會再在常量池中建立新的“123”)
第二種是先在棧中建立一個對String類的對象引用變數str,然後通過符號引用去字串常量池裡找有沒有"abc",如果沒有,則將"abc"存放進字串常量池,並令str指向”abc”,如果已經有”abc”則直接令str指向“abc”。

這時我們應該注意

一方面,第一種寫法有利與節省記憶體空間.同時它可以在一定程度上提高程式的運行速度,因為JVM會自動根據棧中資料的實際情況來決定是否有必要建立新對象。而對於String str = new String("123");的代碼,則一概在堆中建立新對象,而不管其字串值是否相等,是否有必要建立新對象,從而加重了程式的負擔。另一方面,我們在使用諸如String str = "123";的格式定義類時,總是想當然地認為,建立了String類的對象str。
對象可能並沒有被建立!而可能只是指向一個先前已經建立的對象。只有通過new()方法才能保證每次都建立一個新的對象。

請看下列執行個體

package testString;  public class testString {   public static void main(String[] args)   {     String a = "123";     String b = "123";     System.out.println(a==b);     System.out.println(a.equals(b));     System.out.println("------------------------------------------");     /**      * true      * true      * 此處建立一個字串"123"儲存在常量池中      * 因為"123"儲存在常量區,並且唯一,即兩個String引用a和b所的地址相同所以a==b為true      * 並且兩個引用在所指對象在堆中的內容相同所以a.equals(b)為true      */     String c = new String("1234");     String d = new String("1234");     System.out.println(c==d);     System.out.println(c.equals(d));     System.out.println("------------------------------------------");     /*      * false      * true      * 此處建立三個字串“1234”,一個在常量池中,兩個通過new儲存在堆中      * 因為c和d此時指向的是堆中的兩個String對象,所以地址不同 c==d為false      * 但是c與d堆中內容相同所以c.equals(d)為true      */     String e = "a1";     String f = "a"+1;     System.out.println(e==f);     System.out.println(e.equals(f));     System.out.println("------------------------------------------");     /**      * true      * true      * 此處建立“a1”“a”2個字串其中“a1”“a”他們兩個均在常量池中,你可能會問+是個運算子多載嗎?      * 是的,java自己有一定的運算子多載但是你沒法使用定義自己的運算子多載,和c++不同,String f = "a"+1;      * 這句會被編譯器做成 String f=“a1”;這與我們講到的第一種情況相同,不再贅述。      * 編譯器之所以這麼做是因為他在編譯時間就能夠確定      */     String g = "gh";     String hh = "h";     String h = "g" + hh ;     System.out.println(g==h);     System.out.println(g.equals(h));     System.out.println("------------------------------------------");     /**      * false      * true      * 與上面不同的是這裡的h在編譯時間不能確定(編譯器是這樣認為的),所以h所指的對象在運行時確定儲存在堆中,      * 所以g==h為true而g.equals(h)為false      */   }    }

感謝閱讀,希望能協助到大家,謝謝大家對本站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.