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使用
运行结果:
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 }
运行结果:
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 }
结果:
false
true