java中的數據類型分爲兩類:原始數據類型(byte、short、char、int、long、float、double、boolean)和 複合數據類型
1.原始數據類型: 他們之間的比較,應用雙等號(==),比較的是他們的值。
2.複合數據類型(類): 當他們用(==)進行比較的時候,比較的是他們在內存中的存放地址。
因此,除非是同一個new出來的對象,他們的比較後的結果爲true,不然比較後結果爲false。
JAVA當中全部的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲是比較對象的內存地址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現, 而再也不是比較類在堆內存中的存放地址了,而是比較值。 java
Object中的equals方法代碼:
public boolean equals(Object obj) {
return (this == obj);// 比較的是基於複合型數據類型的內存地址
} this
String中的equals方法代碼:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
因此對於複合型數據類型之間的equals比較,在沒有覆寫該方法以前,他們之間的比較仍是基於內存地址的比較。 spa
下面舉個String類型的例子:
1.
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = "Monday";
if (s1 == s2)
{
System.out.println("s1 == s2");}
else{
System.out.println("s1 != s2");}
}
}
編譯並運行程序,輸出:s1 == s2說明:s1 與 s2 引用同一個 String 對象 -- "Monday"!
2.
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}
咱們將s2用new操做符建立
程序輸出:
s1 != s2
s1 equals s2
說明:s1 s2分別引用了兩個"Monday"String對象 對象
緣由解釋:
字符串緩衝池:程序在運行的時候會建立一個字符串緩衝池。
當使用s2 = "Monday"這樣的表達式建立字符串的時候,程序首先會在這個String緩衝池中尋找相同值的對象,
在第一個程序中,s1先被放到池中,因此在s2被建立的時候,程序找到相同值的s1,s2引用s2所引用的對象。
第二段程序中,使用了 new 操做符,他明白的告訴程序:"我要一個新的!不要舊的!"因而一個新的"Monday"Sting對象被建立在內存中。他們的值相同,可是位置不一樣。
3.
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
s2 = s2.intern();
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
} 繼承
此次加入:s2 = s2.intern();
程序輸出:
s1 == s2
s1 equals s2 內存
緣由解釋:java.lang.String的intern方法的返回值是字符串,可是它其實是先檢查該字符串是否在字符串緩衝池中存在,存在就返回該引用,不存在就會把該字符串加到字符串緩衝池中再返回該引用。 字符串