精华内容
下载资源
问答
  • 1.判断两个对象是否是同一个引用对象则用==,"=="比的是地址.因为如果地址相同,则就是同一个对象(java中如果两对象...)2.obj1.equals(Object obj2),用来判断两个对象是否相等。(如果两个变量引用的是两个不同地址...
    1.判断两个对象是否是同一个引用对象则用==,"=="比的是地址.因为如果地址相同,则就是同一个对象
    (java中如果两对象(obj1,obj2)相等,那么在修改obj2的时候,obj1的值也会改变。其实相当于内存中只有一个对象,而obj1和obj2连个变量都指向同一个对象。)
    2.obj1.equals(Object obj2),用来判断两个对象是否相等。
    (如果两个变量引用的是两个不同地址的对象,即使对象的内部参数都是一样的,系统也会认为是不同的两个对象,所以要用equals

    转载于:https://www.cnblogs.com/Im-Victor/p/6275799.html

    展开全文
  • Object类中的equals方法用于检测一个对象是否等于另外一个对象。...例如,采用这种方式比较两个PrintStream对象是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状...

    Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。从这点上看,将其作为默认操作也是合情合理的。然而对于多数类来说,这种判断并没有什么意义。例如,采用这种方式比较两个PrintStream对象是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。

    例如,如果两个雇员对象的姓名、薪水和雇佣日期都一样,就认为它们是相等的(在实际的雇员数据库中,比较id更有意义,利用下面这个示例演示equals方法的实现机制)。

    public booleanequals(Object otherObject)

    {

    Employee other=(Employee)otherObject;//a quick test to see if the objects are identical

    if (this == otherObject) return true;//must reture false if the explicit parameter is null

    if (otherObject == null) return false;//if the classes don't match, they can't be equal

    if (getClass() !=otherObject.getClass())return false;//test whether the fields have identical values

    returnname.equals(other.name)&& salary==other.salary&&hireDay.equals(other.hireDay);

    }

    getClass方法将返回一个对象所属的类。在检测中,只有在两个对象属于同一个类时,才有可能相等。

    Java语言规范要求equals方法具有下面的特性:

    1)自反性:对于任何非空引用x, x.equals(x)应该返回true。

    2)对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回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。

    以下是编写完美的equals方法的建议:

    1、显式参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。

    2、检测this与otherObject是否引用同一个对象:

    if(this == otherObject) return true;

    这条语句只是一个优化。实际上,这是一种经常采用的形式。因为计算这个等式要比一个一个地比较类中的域所付出的代价要小的             多。

    3、检测otherObject是否为null,如果为null,返回false。这项检测是很必要的。

    if(otherObject == null) return false;

    4、比较this与otherObject是否属于同一个类。如果 equals的语义在每个子类中有所改变,就使用getClass检测:

    if(getClass()!=otherObject.getClass()) return false;

    如果所有的子类都拥有统一的语义,就使用instanceof检测:

    if(!(otherObject instanceof ClassName) ) return false;

    5、将otherObject转换为相应的类类型变量:

    ClassName other = (ClassName)otherObject;

    6、现在开始对所有需要比较的域进行比较了。使用==比较基本类型域,使用equals比较对象域。如果所有的域都匹配,就返回true;否            则返回false。

    return field1 == other.field1 && Object.equals(field2, other,field2)&&...

    如果在子类中重新定义equals,就要在其中包含调用super.equals(other).

    以下以一个员工类和经理类来说明equals方法

    public classEmployee {privateString name;private doublesalary;privateDate hireDay;public Employee(String name, double salary, int year, int month, intday) {this.name =name;this.salary =salary;

    GregorianCalendar calendar= new GregorianCalendar(year,month-1,day);this.hireDay =calendar.getTime();

    }publicString getName() {returnname;

    }public doublegetSalary() {returnsalary;

    }publicDate getHireDay() {returnhireDay;

    }public void raiseSalary(doublebyPercent)

    {double raise = salary * byPercent /100;

    salary+=raise;

    }

    @Overridepublic booleanequals(Object otherObject)

    {

    Employee other=(Employee)otherObject;//a quick test to see if the objects are identical

    if (this == otherObject) return true;//must reture false if the explicit parameter is null

    if (otherObject == null) return false;//if the classes don't match, they can't be equal

    if (getClass() !=otherObject.getClass())return false;//test whether the fields have identical values

    returnObjects.equals(name, other.name)&& salary ==other.salary&&Objects.equals(hireDay, other.hireDay);

    }

    @Overridepublic inthashCode(){returnObjects.hash(name, salary, hireDay);

    }

    @OverridepublicString toString() {return getClass().getName()+"{" + "name='" + name + '\'' + ", salary=" + salary + ", "

    + "hireDay=" + hireDay + '}';

    }

    }

    public class Manager extendsEmployee {private doublebonus;public Manager(String name, double salary, int year, int month, intday) {super(name, salary, year, month, day);this.bonus = 0;

    }public doublegetSalary()

    {double baseSalary = super.getSalary();return baseSalary +bonus;

    }public void setBonus(doublebonus) {this.bonus =bonus;

    }

    @Overridepublic booleanequals(Object o) {if (!super.equals(o)) return false;

    Manager other=(Manager) o;return bonus ==other.bonus;

    }

    @Overridepublic inthashCode() {return super.hashCode() + 17 * newDouble(bonus).hashCode();

    }

    }

    展开全文
  • 用哪个???我们先不要着急选择;先来看看使用它们分别输出的结果;根据结果才好剖析它们;先来看“==”号如下图示:上图示例分解:再看 “equals”方法我们再...如下图示:根据万类之根Object对象的equals我们发现...

    6c555bad5fe2f3ba4b2df8c5fadcb505.png

    用哪个???

    我们先不要着急选择;

    先来看看使用它们分别输出的结果;

    根据结果才好剖析它们;


    先来看“==”号

    如下图示:

    73bb257e2872ddc204d299792b6dc652.png

    上图示例分解:

    9dfb3781913860426bdbe16545f9445e.png

    4c10e802321fd1cd80d925d06688a311.png

    再看 “equals”方法

    我们再来使用equals看看结果,

    会发现结果会有些许不同,

    如下图示:

    d7bb7d10b684c2ed69e221507f59298a.png

    上图示例分解:

    c0c51a7c008852d1bf9a4d409ec0e307.png

    944449eb108fd857689c855844608a5b.png

    为了更好的便于我们理解,

    我们进入源代码来逐一看一下;


    源码浅析

    首先我们先打开Object对象的equals;

    如下图示:

    8fefc72e43e18b5c92b637a7782ce8a6.png

    根据万类之根Object对象的equals我们发现;

    本质还是“==”来进行对比数值的;

    只是Integer、String等进行方法重写而已。

    我们再来看一下Integer包装类

    (其他基本类型的包装类都类似在此就不一一举例了)

    的 equals;

    如下图示:

    c441563231497d378a93de385b2dcb3e.png

    只是将包装类转换成int然后进行值对比;

    而本质依然是使用的“==”

    可能你会有疑问了;

    既然本质都是用的“==”为什么String对象前、后两次输出的值不同呢?

    【“==”的输出的是false,“equals”输出的是true】

    再回答问题之前我们先看看它的源代码;

    String引用类型的equals的;

    如下图示:

    4d57c107062a725f1b45899a64a25cf5.png

    我们看到判定对象如果是String实例的话,

    就会将引用类型String转换成了基本类型char(想了解更多看这里

    进行循环比对,如果有不相同的值就返回false。

    简言之,就是将引用比较转换成了值比较(想了解更多看这里

    我们事例使用equals对比的数值是”2”

    值是相同的,所以返回值是true

    从这个角度我们也能很好的理解为

    1、 基本类型对比的是值
    2、 引用类型对比的是内存地址

    这就能解释明明我们的Person实例;

    一个赋值的是“张三”,一个赋值的“李四”

    结果为什么是相等的呢?

    看了Object对象的equals源码我们才知道,

    因为他们对比的不是值,而是内存地址,

    为了验证,

    我们来看下图:

    fd4fa3fe10b3e4009109533a3aa56362.png

    上图示例分解:

    f7f031b30979b90c7a8576b6196f419c.png

    62650b9be8656a3717674772dc5e836a.png

    我们可以看到输出的内存地址,

    都是相同的;

    那么返回true 也就无可厚非啦;

    我们重新给开辟一个内存空间,并把原本赋值的“李四”改成与上个实例相对的“张三”后;

    会发生什么情况呢?

    如下图示:

    7896f2b1ca5447ddc4776cf99040eb71.png

    上图示例分解:

    ab3e4267b185c3c745dda197805d65e0.png

    073ee476bfdcc87941b51f3fe6a1252b.png

    有没有同学已经提前猜度啦呢?

    内容是相同啦,

    但内存是不同的,

    它既然比对的是内存地址,

    返回的结果当然也就由原来的true,变成false啦。


    重写toString() 方法

    有聪明的同学或许会想到了;

    我们上文不是刚说了吗?

    引用类型String的equals方法;

    能将引用比较转换成了值比较

    我们将Person对象转换成String类型不就可以了吗?

    那我们来试试,

    如下图示:

    b9e1e058bca0c732477cda38f84df0e8.png

    上图示例分解:

    89a4aefe2831fa2e17ca4a8fe76cecf0.png

    20f0267bb8fc45b2691f5b6689cc72a1.png

    哎…

    什么情况呢?

    咋不行呢?

    让我们进入到对象的toString()方法里来看下

    5ac96d974d1ea3bdc67023331d06f51c.png

    什么意思呢?

    调用此方法给我返回的是;

    对象的类名称 拼接一个16进制的hashcode码;

    我们给他打印一下看看:

    54ad78c1449223e5fb4206ca1a21227d.png

    上图示例分解:

    903dc64a11706f1cc584cbee2c613b88.png

    7789dfa517a05d6fcd87d52e61c6e62f.png

    确实不相同;

    不怪人家给返回false。

    那你可能要说了,

    你可能气愤啦;

    这个不对啊;

    跟咱们上面说的不是相悖了吗?

    别着急…

    这个toString()不行;

    那咱们给就他造一个行的呗;

    怎么造呢;

    如下图示:

    b741faa15adfe36bf2cdfdd5a05dd095.png

    上图示例分解:

    13498dcce04ac5ec5ec3d1daf81e802c.png

    我们在Person的实体对象内,

    使用Override注解重写toString() 方法,

    接着我们再次运行,看下效果

    如下图示:

    447def610e3470c81e69f7c904609884.png

    上图示例分解:

    2a5bdf6b0548f201ff63efc36293ace2.png

    10bf59c973f41a6d4fe6257da0b4efe1.png

    我们发现重写后的结果,

    符合我们的预期。


    总结一下

    到现在是不是你不是已经掌握了再使用的时候如何选择呢?

    1、基本变量的比较方式我就用“==”
     
    2、如果要比较实际内存中的内容,我们就要用“equals”方法
     
    3、如果是我们自己定义的实例类,
       我们自定义的类都是继承自object
       从上文的源码分析推导出,
       用“equals”或“==”都是一样的
    展开全文
  • 当我们对类与对象有一定的了解后,不难发现,要想对两个对象的内存地址进行比较,使用“==”运处符就可以实现。2.首先,我们创建一个类。3.使用if控制语句判断两个对象的内存地址是否相等。4.下面是完整代码,.....

    什么叫对象?对象即object,它是类的实例化后的产物。它有两个特征:1.静态特征,2.动态特征。静态特征是指对象的属性;动态特征指对象的功能。

    工具/原料

    Eclipse

    方法/步骤

    1.编前分析。当我们对类与对象有一定的了解后,不难发现,要想对两个对象的内存地址值进行比较,使用“==”运处符就可以实现。

    2.首先,我们创建一个类。

    c19a601d86dd70b4c2d7748b5584fd53.png

    3.使用if控制语句判断两个对象的内存地址值是否相等。

    9662b19b07003f1fde19f5e620a28c79.png

    4.下面是完整代码,提供大家参考。

    public class BiJiao {

    public static void main(String[] args) {

    // TODO 自动生成的方法存根

    String a=new String("test");

    String b=new String("test");

    String c=b;

    if(a==b)

    {

    System.out.println("a==b");

    }

    else

    {

    System.out.println("a!=b");

    }

    if(b==c)

    {

    System.out.println("b==c");

    }

    else

    {

    System.out.println("b!=c");

    }

    }

    }

    5.运行结果如图。

    b350dd9d02b521073105a79b61572aa2.png

    6.代码分析:有些读者可能会问,a和b完全一样,为什么不等于?a与b这两个对象在堆内存里分别在不同的内存地址,是因为我们“new”一个对象的时候,内存会为它开劈一个新的内存空间,所以a与b是不等于的。而b与c是相等的,因为是把b的内存地址赋给c。

    展开全文
  • /*** 比较对象是否发生了改变* @param obj1* @param obj2* @return*/public static boolean contrastObj(Object obj1, Object obj2) {boolean isEquals = true;if (obj1 instanceof objec && obj2 ...
  • Java中,比较简单类型变量用“==”,只要两个简单类型值相等即返回ture,否则返回false;   二、引用类型比较   引用类型比较比较变态,可以用“==”,也可以用“equals()”来比较,equals()方法来自于Object...
  • 知识点:重写equals()方法首先来看一些文字性的东西:一、简单类型比较Java中,比较简单类型变量用“==”,只要两个简单类型值相等即返回ture,否则返回false;二、引用类型比较引用类型比较比较变态,可以用“==”...
  • Object ???? Object 类是Java中所有类的始祖,在Java中每个类都扩展了Object。 如果没有明确地指出超类,Object就被认为是这个类的超类。 在Java中,只有基本数据...== 和 equals.() 两者均可用于比较两个对象是否相
  • 总的来说,可以分成种,一种是判断地址是否相等-==,第二种是判断是否相等-equals。首先,Object类作为所有类的超类。Object类的equals方法是直接比较地址。源码:publicbooleanequals(Objectobj){returnthis==o...
  • Java中,比较简单类型变量用“==”,只要两个简单类型值相等即返回ture,否则返回false; 二、引用类型比较 引用类型比较比较变态,可以用“==”,也可以用“equals()”来比较,equals()方法来自于Object类,...
  • Object类概述:1.Object...基本类型比较值:只要两个变量的值相等,即为true。2.引用类型比较引用(是否指向同一个对象):只有指向同一个对象时,操作符==才返回true。3.用操作符==进行比较时,符号两边的数据类型必...
  • Objectjava.lang.Object 类是所有类的根如果一个类在定义时没有指定继承谁它的父类就是Object Object中三个常用的实例方法是 equals) 方法比较两个对象是否相等 toString) 方法将返回代表这个对象的一个字符串 ...
  • 下面对普通的Java类重写.euqals方法,用于判断两个类是否相等(值相等)。编写一个完美equals方法的建议:1. 显示参数命名为otherObject,稍后需要将它转换成另外一个叫做other的变量。2. 检测thi...
  • java.lang.Object.equals()函数默认情况下是不能用来比较组合对象的,例如密钥。... 下面的代码使用equals()函数比较两个key,key即使具有相同的取值也可能会返回不相等,导致结果出错。 private static b
  • equals()和hashcode()这两个方法都是从Object类中继承过来的。 equals()方法在Object类中...是对两个对象的地址进行的比较(即比较引用是否相同)。 但是String 、Math、还有Integer、Double等封装类使用equals()...
  • 2. equals(Object obj):比较两个对象是否相等。 (1) == 运算符 基本数据类型的比较时比较两个变量保存的数据是否相等,类型不一致也可能相等。引用数据类型的比较时比较地址是否一致。 int i = 10; dou.
  • Java中的 Object

    2021-04-09 20:36:41
    Java中的 Objectjava.lang.Object 类是Java语言中的根类,即所有类的父类。...equal 的返回值是一个布尔 作用是 比较两个对象的地址是否相等 (注意 == 比较的是对象的是否相等) 重写 Object 类的 equal
  • 您正在尝试比较两个不同的对象而不是它们的. z和h指向两个不同的Integer对象,它们保持相同的.z == h将检查两个对象是否相等.所以它会返回false.如果要比较Integer对象存储的,请使用equals方法.Integer z = new...
  • 基本数据类型变量:比较两个变量保存的数据是否相等。 引用数据类型变量:比较两个对象的地址是否相同。 equal() 是一个方法,而非运算符。 只能使用于引用数据类型。 Object中定义equal()和==作用相同。 ...
  • Java Object

    2019-08-25 20:10:57
    Object Object是所有类的超类,是Java语言中唯一一个没有父类的... 比较两个对象的是否相等(比较地址) hashCode: 该方法返回对象的哈希码值,哈希码是一个代表对象的十六进制整数,不同的对象哈希码不相同 toSt...
  • Object对象 Object类是所有类的祖宗父类,没有使用extend明显继承的类的直接父类。 Object类的方法是所有类都隐式拥有的,具体有以下8 种。 ...比较两个对象的是否相等 clone Object 克隆 ...
  • Java 回顾笔记_Object

    2016-03-01 10:17:08
    == 和 Equals 的区别  1. == 是一个运算符。  2.Equals则是string对象的方法,可以.(点)出来... ==和Equals都比较两个值是否相等相等为true 否则为false;    2、引用对象比较(对象之类的)  ==和Equals都是比
  • 明明两个整数值相等,但是结果却为false。丈二的和尚摸不着头脑呀。后来通过查阅资料才明白,以下是整理的内容,供以后查阅。 Java的Integer对象有个私有静态内部类IntegerCache,将-128至127之间整数提前实例化了...
  • 简单来说就是两个引用指向同一个对象才相等 适用范围:基本数据类型 实质上就是调用Object类中的equals方法 对于==,如果作用于基本数据类型的变量(byte,short,char,int,long,float,double,boolean ),则直接比较...
  • javaobject

    2016-03-24 15:51:00
    比较两个对象是否相等。内部比较两个对象的地址。 2.String toString() 将对象变成字符串。默认返回的格式:类名@哈希=getClass().getName()+'@'+Integer.toHexString(hashcode()) 3.Class getCla...
  • java 10 Object

    2020-07-29 01:11:22
    Object 类的equals()方法默认在比较两个对象的地址是否相同,但是老是比较地址意义不大,我们想要比较两个对象的成员变量是否相同,如果相同,我们认为两个对象就相等。也就是说,子类想要按照他的比较方式...
  • Java面试之Object

    2018-12-26 15:51:14
    1、Object中有哪些公共方法? equals() clone() getClass() notify(),notifyAll(),wait() ...如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产...
  • 2 在object类中,hashcode()方法是本地方法,返回的是对象的地址,而object类中的equals()方法比较的也是两个对象的地址 ,如果equals()相等,说明两个对象地址相等,当然hashcode()也就相等了。一旦一个类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 662
精华内容 264
关键字:

java比较两个object值相等

java 订阅