Java-從堆棧常量池解析equals()與==

來源:互聯網
上載者:User

標籤:

一.基本概念

①JAVA中的基礎資料型別 (Elementary Data Type)(簡單類型,內建類型):

  位元組型(byte),短整型(short),整型(int),長整型(long),字元型(char),浮點型(float),雙精確度型(double),布爾型(boolean);注意都是小寫,沒有String類型,String類型不是Java中的基礎資料型別 (Elementary Data Type)。

②變數類型(按變數的範圍區分):

  全域變數,成員變數,局部變數。

③堆:

  存放所有new出來的對象,該對象的引用存在棧中,當棧中的引用消失後堆中的對象的由記憶體回收行程負責回收。

④棧:

  存放基本類型的變數的引用和其他對象的引用,但對象本身不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字串常量對象存放在常量池中。)

  棧中的資料大小和生命週期是可以確定的,當沒有引用指向資料時,這個資料就會消失。

⑤常量池:

  存放字串常量和基本類型常量(final修飾的在編譯期間就能夠確定的並被儲存在已編譯的.class檔案中的一些資料)。

 1 package cn.edu.whu.compare; 2  3 public class CompareTest { 4     public static void main(String[] args) { 5         // "ab"存在常量池中,a指向常量池中"ab"的地址 6         String a = "ab"; 7         // “b”存在常量池中 8         final String bb = "b"; 9         String cc = "b";10         String b = "a" + bb;11         String c = "a" + cc;12         /**13          * 變數b的值在編譯就可以確定指向常量池中“ab”的地址, 因為bb使用了final修飾並且bb指向確定的字串14          * 變數c的值只有在運行時才能確定,變數c相當於在運行時new了一個String對象,這個新Object Storage Service在堆中15          */16         System.out.println(bb == cc);// true17         System.out.println(a == b); // true18         /**19          * a指向“ab”在常量池中"ab"的地址 c指向在運行時建立的對象“ab”在堆中的地址20          * c.intern()返回一個String對象,這個String對象指向--->c指向的對象“ab”在常量池中的地址21          */22         System.out.println(a == c); // false23         System.out.println(a == c.intern()); // true24     }25 }

二.equals()與==的區別

①關於==操作符

此操作符比較兩個對象(上執行個體中的各種變數名,常量名)在棧中的值(是一個記憶體位址,該地址存了實際的對象的內容),如果值相等則返回True,否則返回False

②Object類定義的equals方法:

1 public boolean equals(Object obj) {2         return (this == obj);3     }

  即:Object類的equals是直接通過==比較兩個對象的記憶體位址,那麼也就是說任何繼承自Object類的子類如果不重寫equals方法那麼其實equals與==兩種比較方法結果是一樣的。

③String類定義的equals方法

 1     public boolean equals(Object anObject) {
       //當兩個比較對象的記憶體位址相同時就不用在比較了直接返回true,因為記憶體位址都相等了,存的東西肯定一樣啊!! 2 if (this == anObject) { 3 return true; 4 }
      //比較字串中的每一個字元,只有每一個字元值都相等那麼兩個對象才equals 5 if (anObject instanceof String) { 6 String anotherString = (String)anObject; 7 int n = value.length; 8 if (n == anotherString.value.length) { 9 char v1[] = value;10 char v2[] = anotherString.value;11 int i = 0;12 while (n-- != 0) {13 if (v1[i] != v2[i])14 return false;15 i++;16 }17 return true;18 }19 }20 return false;21 }

參照上面注釋所講的,多餘的不解釋了。

 

著作權,轉載請註明出處!

Java-從堆棧常量池解析equals()與==

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.