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

一.基本概念this

①JAVA中的基本數據類型(簡單類型,內置類型):spa

  字節型(byte),短整型(short),整型(int),長整型(long),字符型(char),浮點型(float),雙精度型(double),布爾型(boolean);注意都是小寫的,沒有String類型,String類型不是Java中的基本數據類型。code

②變量類型(按變量的做用域區分):對象

  全局變量,成員變量,局部變量。blog

③堆:繼承

  存放全部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對象,這個新對象存儲在堆中
15          */
16         System.out.println(bb == cc);// true
17         System.out.println(a == b); // true
18         /**
19          * a指向「ab」在常量池中"ab"的地址 c指向在運行時建立的對象「ab」在堆中的地址
20          * c.intern()返回一個String對象,這個String對象指向--->c指向的對象「ab」在常量池中的地址
21          */
22         System.out.println(a == c); // false
23         System.out.println(a == c.intern()); // true
24     }
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 }

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

 

版權全部,轉載請註明出處!

相關文章
相關標籤/搜索