==,equals区别和equals方法重写

java中的数据类型,可分为两类:

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

如下图

但在一些类库当中这个方法被重写了,如String,ArrayList在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。

如下图

ArrayList中的equals

String 中的equals


  对于复合数据类型之间进行equals比较,在没有重写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较的结果跟双等号(==)的结果相同。

举几个例子

    String a = "bbb";
       String b = "bbb";
       String c = new String("bbb");
       String d = new String("bbb");

       System.out.println(a==b);
       System.out.println(a==c);
       System.out.println(c==d);

       System.out.println();

       System.out.println(a.equals(b));
       System.out.println(a.equals(b));
       System.out.println(c.equals(d));

运行结果是

true

false

false

true

true

true

在使用==比较时

a==b返回true 说明 a b 引用同一个String对象(使用 a = "bbb" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象)

a==c返回false说明 c创建了一个新的对象  (而不引用同一个”bbb”对象,新建了一个)

c==f返回 false说明d也是创建了一个新的对象。

使用equals比较时

由于比较的是内容不是地址  所以都为true

而由于复合数据类型之间进行equals比较,在没有重写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较的结果跟双等号(==)的结果相同。

如下

public class EqualsDemo {

    String b;
    public EqualsDemo(String i){
       this.b=i;
    }
    public static void main(String[] args) {

       EqualsDemo a = new EqualsDemo("1");
       EqualsDemo b = new EqualsDemo("1");
       EqualsDemo d = new EqualsDemo("2");
       EqualsDemo c = a;

       System.out.println(a==c);
       System.out.println(a==d);
       System.out.println(b==c);
       System.out.println(b==a);

       System.out.println(a.equals(c));
       System.out.println(a.equals(d));
       System.out.println(b.equals(c));
       System.out.println(b.equals(a));
    }
}

运行结果

true

false

false

false

true

false

false

false

== 和equals结果相同

但是在实际的使用过程中我们需要比较两个对象的内容是否相等,就如上例中对象a和对象b

所以我们要重写equals方法。

1.自反性:对于任何非空引用x,x.equals(x)应该返回true。
2.对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3.传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4.一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5.非空性:对于任意非空引用x,x.equals(null)应该返回false。

下面为对应的重写代码格式

  @Override
    public boolean equals(Object obj) {
       if(this == obj)
           return true;
       if(obj == null)
           return false;
       if(!(obj instanceof EqualsDemo))
           return false;
       EqualsDemo other = (EqualsDemo)obj;
       if(b == null){
           if(other.b !=null)
              return false;
       }else if(!b.equals(other.b))
           return true;
       return true;
    }

  

重写代码后,运行程序,结果如下

true

false

false

false

true

true

true

true

时间: 2024-12-19 16:03:03

==,equals区别和equals方法重写的相关文章

JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { private String province; private String city; public String getProvince() { return province; } public void setProvince(String province) { this.province = p

Java 中equals和toString()方法重写

1,equals方法 (1)什么时候需要重写? 如果希望不同内存但相同内容的两个对象equals时返回true,则需要重写equals (2)怎么重写? class A { public int i; pulic A(int i)//构造函数 {this.i=i; } public boolean equals(Object obj)//重写equals {A aa=(A)obj; if(this.i==aa.i) return true; else return flase; } } publ

HashSet中存方用户自定义数据类型数据,重写equals方法和hashCode方法

import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(String[] args) { /* *对于用户自定义类型的数据放在容器(Set)中 *务必重写equals和hashCode方法 *要不然stu1和stu2放在容器中,和认为是两个不同的元素 **/ //set中存放的元素是无序的 //set中存储的元素是不可以重复的(根据equals方法和hashCod

Java中的==和equals区别

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

==和equals区别

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

java基础解析系列(十一)---equals、==和hashcode方法

java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---Integer缓存及装箱拆箱 java基础解析系列(三)---HashMap原理 java基础解析系列(四)---LinkedHashMap的原理及LRU算法的实现 java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 j

详解equals()方法和hashCode()方法

前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方法,都可以被重写(overwrite). 本文介绍了2种方法在使用和重写时,一些需要注意的问题. 一.equal()方法 Object类中equals()方法实现如下: public boolean equals(Object obj) { return (this == obj); } 通过该实现

关于 warning CS0659:“***”重写Object.Equals(object o)但不重写Object.GetHashCode()

对象相等性和同一性 System.Object 类型提供了以下方法, 1 namespace System 2 { 3 // 4 // 摘要: 5 // 支持 .NET Framework 类层次结构中的所有类,并为派生类提供低级别服务.这是 .NET Framework 中所有类的最终基类:它是类型层次结构的根. 6 [ClassInterface(ClassInterfaceType.AutoDual)] 7 [ComVisible(true)] 8 public class Object

关于Object类的equals方法和hashCode方法

关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为true: 3.传递性:x.equals(y)为true,y.equals(z)为true,那么x.equals(z)也为true: 4.一致性:x.equals(y)的第一次调用为true,那么x.equals(y)的第二次,第三次,...,第n次调用也为true,前提条件是在比较之间没有修改x,也没