標籤:
一.基本概念
①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()與==