1. 程式人生 > 其它 >執行緒優先順序佇列實現執行緒間同步

執行緒優先順序佇列實現執行緒間同步

equals和==

equals方法

equals方法是在Object類中定義的,它是提供物件是否”相同“的邏輯,如:x.equals(y),return (this == obj);如果x和y是同一個物件的引用返回True否則返回false。所以它的作用與==沒有什麼區別都是比較記憶體地址。所以你想用equals比較兩個物件的內容的值相同是不行的,而一般的類都是間接或直接基礎了Object類,如果不進行重寫equals方法是無法比較內容是否相同的。如:String、Date等,就進行了重寫equals

對於String類中的equals方法

String類中重寫了equals方法用來比較兩個字串的內容是否相同

對於==在String中是比較引用記憶體地址是否相同,如下s1==s2為什麼為true,因為s1和s2是直接建立的它們放在公共池中引用是相同的,所以為true。而s4==s5為什麼為false,因為是使用new建立了String物件,它們會放在堆中所以引用不同,地址是不一樣的,所以為false

      String s1="zll";
String s2="zll";
String s4=new String("123");
String s5=new String ("123");
System.out.println(s1.equals(s2));//true
System.out.println(s1 == s2);//true
System.out.println(s4.equals(s5));//true
System.out.println(s4 == s5);//false

對於引用型別陣列中equals方法

它沒有進行重寫equals方法,所以是無法使用equals來比較內容的。比較的還是地址值

        int[] arr={1,2};
int[] arr2={1,2};
System.out.println(arr.equals(arr2));//false

對於自己建立的物件中的equals方法

它也是沒有進行重寫equals方法的,也無法比較兩個物件的內容是否相同

package com.zll;

public class Demo {
public static void main(String[] args) {
TestDemo t1=new TestDemo("張三",10);
TestDemo t2=new TestDemo("張三",10);
System.out.println(t1.equals(t2));//我自己重寫了equals方法返回true,如果沒有重寫equals方法返回為false,
}
}
class TestDemo{
String name;
int age;
public TestDemo(String name,int age){
this.name=name;
this.age=age;
}
public boolean equals(Object obj){
if(obj==null){
return false;
}
//如果呼叫該方法的物件和傳入的物件是同一個,則直接返回true
if(this==obj){
return true;
}
TestDemo p = (TestDemo) obj;//因為Object類中沒有子類Demo的name,age屬性,所以要向下轉型成Demo類
if(this.name.equals(p.name) && this.age==p.age){//呼叫的name等於傳入的name或者呼叫的age等於傳入的age返回true
return true;
}
return false;
}
}

對於基本資料型別

如果你是基本型別資料(如果是int,double,char..)只能用==來比較是否相同它比較的是內容是否相同,沒有equals方法(包裝型別除外如:Integer、Double它們可以用equals來比較內容是否相同)