"=="和equals方法有什麼區別?
阿新 • • 發佈:2018-11-19
equals()和“==”操作用於物件的比較,檢查倆物件的相等性,但是他們倆的主要區別在於前者是方法,後者是操作符。
總結:
1 一般使用比較原生型別如:boolean、int、char等等,使用equals()比較物件。
2 如果兩個引用指向相同的物件返回true,equals()的返回結果依賴於具體業務實現,一般重寫equals方法時,同樣重寫hashcode方法,預設的equals方法實現是與“”操作一樣的。
3 字串的對比使用equals()代替操作符
參考程式碼: EqualsTest
// "=="和equals測試 public class EqualsTest { public static void main(String[] args) { int a = 1; int b = 1; int c = 2; System.out.println(a == b); // true System.out.println(a == c); // false String s1 = new String("str"); String s2 = new String("str"); System.out.println("s1 == s2: " + (s1 == s2)); // false,比較的是記憶體地址,引用 System.out.println("s1 equals s2: " + (s1.equals(s2))); // true // 物件的比較一般重寫equals和hashcode方法 Student stu1 = new Student(1, "張三"); Student stu2 = new Student(1, "張三"); System.out.println("stu1 == stu2 : " + (stu1 == stu2)); // false System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2)); // true } static class Student { private int age; private String name; public Student() { } public Student(int age, String name) { super(); this.age = age; this.name = name; } public int getAge() { return age; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public void setName(String name) { this.name = name; } /** * 年齡和名稱都相等的時候 */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } } }
import java.util.HashSet; import java.util.LinkedList; import java.util.Set; public class EqualsTest { public static void main(String[] args) { LinkedList<Student> list = new LinkedList<Student>(); Set<Student> set = new HashSet<Student>(); Student stu1 = new Student(1, "張三"); Student stu2 = new Student(1, "張三"); System.out.println("stu1 == stu2 : " + (stu1 == stu2)); System.out.println("stu1.equals(stu2) : " + stu1.equals(stu2)); list.add(stu1); list.add(stu2); System.out.println("list size:" + list.size()); System.out.println("下面的HashSet的內容====="); set.add(stu1); set.add(stu2); System.out.println("set size:" + set.size()); // 修改學生的年齡,hashcode的值會改變 // 當我們將某個物件存到set中時,如果該物件的屬性參與了hashcode的計算, // 那麼以後就不能修改該物件參與hashcode計算的那些屬性了,否則會引起意向不到的錯誤的。 stu1.setAge(40); System.out.println("刪除元素stu1是否成功: " + set.remove(stu1)); System.out.println("操作刪除元素後set size:" + set.size()); } }