java中的equals 与 ==

总结来说:

  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

原文地址:https://www.cnblogs.com/crazytrip/p/7154162.html