java中的==与equals()

==用法

1.比较基本数据类型,如果两个值相同,则结果为true

2.比较引用时,如果引用指向内存中的同一对象,结果为true

equals()用法

  函数原型:public boolean equals(Object obj)

1.当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false

既然是两者有同样的作用,为什么还要弄出一个equals()方法来呢。因为==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。

  示例:

 1 /**
 2  * @author xiaoyuer
 3  *
 4  */
 5 public class Students 
 6 {
 7     private int age;
 8     private String name;
 9     
10     public Students (int age,String name)
11     {
12         this.age = age;
13         this.name = name;
14     }
15 
16     public int getAge() {
17         return age;
18     }
19 
20     public void setAge(int age) {
21         this.age = age;
22     }
23 
24     public String getName() {
25         return name;
26     }
27 
28     public void setName(String name) {
29         this.name = name;
30     }    
31 }
32 
33  class EqualTest
34 {
35     public static void main(String args[])
36     {
37         Students e1 = new Students (18,"张三");
38         Students  e2 = new Students (18,"张三");
39         
40         System.out.println(e1 == e2);
41         System.out.println(e1.equals(e2));
42     }
43 }
44 equals使用
equals使用

运行结果

false

false

结果说明:使用"=="号跟使用equals()方法结果都为false,说明equals()函数的本意为确定两个对象的引用是否相同

JDK提供了覆盖机制:

而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

  示例:

 1  class EqualTest
 2 {
 3     public static void main(String args[])
 4     {        
 5         String e1=new String("aaa");
 6         String e2=new String("aaa");
 7 
 8         System.out.println(e1 == e2);
 9         System.out.println(e1.equals(e2));
10     }
11 }
jdk覆盖机制

运行结果

false

true

结果说明:在String中equals()方法被进行了覆盖,使其意义变为比较两个对象的内容是否一致

拓展提升:复写equals()方法,实现比较其他内容

我们还应该注意,Java语言对equals()的要求如下,这些要求是必须遵循的:
• 对称性:如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true”。
• 反射性:x.equals(x)必须返回是“true”。
• 类推性:如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true”。
• 还有一致性:如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true”。
• 任何情况下,x.equals(null),永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”。
以上这五点是重写equals()方法时,必须遵守的准则,如果违反会出现意想不到的结果,请大家一定要遵守。

 

equals()相等的两个对象,hashcode()一定相等;
equals()方法不相等的两个对象,hashcode()有可能相等。(可能存在哈希冲突)。

 1 /**
 2  * @author xiaoyuer
 3  *
 4  */
 5 public class Students 
 6 {
 7     private int age;
 8     private String name;
 9     
10     public Students (int age,String name)
11     {
12         this.age = age;
13         this.name = name;
14     }
15     
16     @Override
17     public boolean equals(Object obj)
18     {
19         //1.判断传入的对象是否与对象obj地址一样
20         if (this == obj)
21            return true;
22         
23         //2.x.equals(null),永远返回是“false”;
24         if (obj == null)
25            return false;
26         
27         //1.反射性
28         if (getClass() != obj.getClass())
29            return false;
30         
31         Students  other = (Students) obj;
32         
33         if (name == null) 
34         {
35            if (other.name != null)
36                //name不为空,且不相等,返回false
37                return false;
38         }
39         else if (!name.equals(other.name))
40             return false;
41         
42         //age不想等,返回false
43         if (age!= other.age)
44             return false;
45         
46         return true;
47 
48     }
49 
50     //复写了equals()方法后还要复写hashCode()方法, 以保证相同的对象返回相同的hashcode
51     @Override
52     public int hashCode()
53     {
54         int result = 1;
55         final int prime = 31;
56         result = prime * result + ((name == null)?0:name.hashCode());
57         result = prime * result + age;
58         return result;
59     }
60     
61     public int getAge() {
62         return age;
63     }
64 
65     public void setAge(int age) {
66         this.age = age;
67     }
68 
69     public String getName() {
70         return name;
71     }
72 
73     public void setName(String name) {
74         this.name = name;
75     }    
76 }
77 
78  class EqualTest
79 {
80     public static void main(String args[])
81     {        
82         Students e1=new Students(18,"张三");
83         Students e2=new Students(18,"张三");
84 
85         System.out.println(e1 == e2);
86         System.out.println(e1.equals(e2));
87     }
88 }
复写equals

结果:

false

true

 

posted @ 2015-06-10 21:52  BAOXF  阅读(240)  评论(0编辑  收藏  举报