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

时间: 2024-12-28 21:44:16

java中的==与equals()的相关文章

Java中的==和equals方法详解

Java中的==和equals   1.如果比较对象是值变量:只用== 2.如果比较对象是引用型变量: ==:比较两个引用是不是指向同一个对象实例. equals: 首先Object类中equals的实现是直接调用了==操作. 一个自定义类继承自Object且没有重写equals方法,那么其equals操作也是与Object类一样,仅仅是直接调用==操作. 如果一个类重写过equals方法(或者继承自一个重写过equals方法的类),那么效果与==操作不同 如果是你自己定义的一个类,比较自定义类

Java中的==和equals区别

引言:从一个朋友的blog转过来的,里面解决了两个困扰我很久的问题.很有久旱逢甘霖的感觉. 中软国际电子政务部Jeff Chi总结,转载请说明出处. 概述:        A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型的时候,是比较对象是否相同.        B.对于String a = “a”; Integer b = 1;这种类型的特有对象创建方式,==的时候值是相同的.        C.基本类型没有equals方法,equals只比较值(对象中的

java中的==、equals()、hashCode()源码分析(转载)

在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 String s2 = "nihao"; 5 Str

java中的==、equals()、hashCode()

java中的==.equals().hashCode()源码分析 在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: 1 public class ComAddr{ 2 public static void main(String[] args) throws Exception { 3 String s1 = "nihao"; 4 Str

java中的==和equals的区别

关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指正,谢谢. 在JAVA程序中一般的基本类型(值类型int,double,boolean等)都只能通过 = = 来判断值是否相等. 如:System.out.println(1==1);System.out.println(true==true);√ 不能写成System.out.println(1.

面试点:Java 中 hashCode() 和 equals() 的关系

Java 中 hashCode() 和 equals() 的关系是面试中的常考点,如果没有深入思考过两者设计的初衷,这个问题将很难回答.除了应付面试,理解二者的关系更有助于我们写出高质量且准确的代码. 一.基础:hashCode() 和 equals() 简介 在学习 hashCode() 和 equals() 之间的关系之前, 我们有必要先单独地了解他俩的特点. equals() equals() 方法用于比较两个对象是否相等,它与 == 相等比较符有着本质的不同. 在万物皆对象的 Java

Java 中的== 和equals()方法

Java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值. 2.引用数据类型(类) 当它们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. Java当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equa

java中,==跟equals的区别

在java中,经常有一些刚入行的新手分不清==跟equals的区别.==操作符是专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或者两个变量是否相等,只能用==操作符.如果一个变量指向的数据是对象类型,这时候就涉及了两块内存,对象本身占用已快内存,变量本身也占用一块内存,例如:Object obj = new Object();中,变量obj是一个内存,new Object();是另一个内存.此时,变量obj所对应的内存中存储的数值

Java中hashcode,equals和==

hashcode方法返回该对象的哈希码值. hashCode()方法可以用来来提高Map里面的搜索效率的,Map会根据不同的hashCode()来放在不同的位置,Map在搜索一个对象的时候先通过hashCode()找到相应的位置,然后再根据equals()方法判断这个位置上的对象与当前要插入的对象是不是同一个.若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象. 所以,Java对于eqauls方法和hashCode方法是这样规定的: 1.如果两个对象相同,那么

java中hashcode()和equals()的详解

今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashcode()这两个方法都是从object类中继承过来的. equals()方法在object类中定义如下: public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同).但是我们必需清