equals方法和 ‘==’的區別
在面試中,經常會問的問題;
Java編程思想中說到 “關系操作符生成的是一個boolean結果,它們計算的是操作數的值之間的關系”。簡單點來說,“==”相比較值是否相等。
可以這樣理解,基本數據類型定義生成在棧內存中,那么在比較的時候,比較的值,所以,只要值相等,那么結果就為true。而String相比較的時候,String為引用數據類型,生成對象的時候,存放在堆內存中,在棧內存中放的是堆內存地址的引用,所以即使值是相等的,但是比較的地址是不相等的。結果為false。
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=3;
int m=3;
System.out.println(n==m);
String str = new String("hello");
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1==str2);
str1 = str//將str的地址賦值給str1
str2 = str;//將str的地址賦值給str2
System.out.println(str1==str2); //因為比較的是地址,而兩個的地址都是str的地址,所以為true
}
}
================
結果為: true false true
判斷兩個字符串是否相等的時候,是否可以出現字符串為空的情況:
public class StringEqual {
public static void main(String[] args) {
StringEqual stringEqual = new StringEqual();
String a = "hello";
String b;
stringEqual.func(a,b); //沒有定義的時候,在啟動的時候直接報錯,代碼有誤,必須初始化值菜能比較
}
public boolean func(String a , String b){
return (a.equals(b));
}
}
public boolean equals(Object anObject) {//name2傳入equals方法,anObject指向name2,name2是上轉型對象
if (this == anObject) {//this代指調用equals方法的name1,name1和name2地址不一樣,繼續向下運行
return true;
}
if (anObject instanceof String) {//此處用於判斷name2是否是String類或其子類,此處是,繼續運行
String anotherString = (String)anObject;//對象下轉型
int n = value.length;//在編譯器中可看出value是全局變量,其前存在省略掉的this(即n = this.value),用於測量name1的長度
if (n == anotherString.value.length) {//判斷name1和name2指向的字符串長度是否相等,此處相等,繼續運行
char v1[] = value;//將name1指向的字符串存入字符數組v1
char v2[] = anotherString.value;//將name1指向的字符串存入字符數組v2
int i = 0;
while (n-- != 0) {//利用循環,逐字符比對兩字符串,若有任何不同,返回false,否則返回true
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
""和null的區別:
null是沒有地址
""是有地址但是里面的內容是空的