总结来说:
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
简单来说,如果是普通基础数据类型,判断是否想等,就用==比较;
如果是引用数据类型,== 和 equals方法比较的都是引用对象的地址,每个实例化的对象在内存中都是单独存放的,及时实例化两个对象属性都相同,也是不同的内存空间,所以会返回false;
但是,String的equals比较的是字符串内容,因为String中重写了euquals方法。
字符串还有一点需要注意:
String s1 ="abc"; String s2 = "abc"; System.out.println(s1==s2); //输出 true,因为这里从字符串池里取,没有新创建对象 String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s3==s4); //输出 fasel,因为创建了两个不同内存空间的对象
System.out.println(s1.equals(s2));System.out.println(s3.equals(s4) ; //输出都是 true,因为String已重写equals方法,比较的是内容
Java中怎样判断两个对象是否相等呢?
对象必须同时重写 hashCode() 和 equasl() 方法,自定义比较方式。例如:
1 import java.util.*; 2 3 /** 4 * Set测试用例 5 */ 6 class Student { 7 private String name; 8 private String number; 9 10 Student(String name, String number) { 11 this.name = name; 12 this.number = number; 13 } 14 15 /** 16 * 重载equals()和hashcode() 17 */ 18 @Override 19 public boolean equals(Object obj) { 20 if(obj == null) { 21 return false; 22 } 23 if(getClass() != obj.getClass()) { 24 return false; 25 } 26 final Student other = (Student) obj; 27 return true; 28 } 29 30 @Override 31 public int hashCode() { 32 int hash = 5; 33 hash = 13 * hash + (this.name != null ? this.name.hashCode() : 0); 34 hash = 13 * hash + (this.number != null ? this.number.hashCode() : 0); 35 return hash; 36 } 37 38 39 @Override 40 public String toString() { 41 return String.format("(%s, %s)", name, number); 42 } 43 } 44 45 public class Students { 46 public static void main(String[] args) { 47 Set set = new HashSet(); 48 set.add(new Student("Tom", "001")); 49 set.add(new Student("Sam", "002")); 50 set.add(new Student("Tom", "001")); 51 System.out.println(set); //此时set中只有两个元素:[(Tom,001),(Sam,002)] 52 } 53 }
其他:
对象的toString方法,如果对象中没有重写toString方法,则返回的是类名+@+哈希码,例如:System.out.println(Studnet); 将打印出: Student@6e1408