搜索
写经验 领红包
 > 职场

java中equals方法怎么用(java中equals的用法)

导语:Java中equals方法详解(java基础总结系列)

Java中equals方法详解(java基础总结系列)

一、equals方法介绍:

1、在Object类中定义有如下图jdk源码

表示定义对象是否"相等"的逻

2、例: x.equals(y) 当x和y是同一对象的引用时返回true 否则返回false

3、Java提供了一些类,如String,Date等,重写了Object的equals方法,使得x.equals(y)比较时,当x和y所引用的对象是同一类对象且属性内容相等时(并不是同一个对象),返回true 否则返回false

5、可以根据需要在业务自定义类型中重写equals

二,用下面例子掌握equals用法

1、画出内存分析图分析u1和u2比较的结果

User u1 = new User(18, 55) ;

User u2 = new User(18, 55) ;

执行完之后内存之中的布局如下图所示,

u1指向一个对象,u2也指向一个对象 u1 、u2 存储的是这两个User对象在堆内存的地址,这两个User对象存储在不同的存储空间, 故这两个User对象不可能相等,所以System.err.println(u1==u2); //打印的结果为false

Object类提供了一个equals()方法来比较两个对象的内容是否相同,因此我们可以采用这个方法去比较两个对象是否在逻辑上"相等"。如:u1.equals(u2);这里是调用从Object类继承下来的equals()方法,通过查阅API文档得到Object类里的equals方法的定义如下:

在Object这个类里面提供的Equals()方法默认的实现是比较当前对象的引用和你要比较的那个引用它们指向的是否是同一个对象,即和"u1==u2"这种写法是一样的,"u1.equals(u2)"与"u1==u2"是完全等价的。因此直接使用继承下来的equals()方法也是无法直接比较两个对象的内容是否相同的,

为此,我们必须得重写equals()方法,改变这个方法默认的实现。(如下图所示)

这时候重写equals方法后

System.out.println("u1 == u2结果是:"+(u1 == u2)); // 结果依然为false:因为这里是比较两个对象的引用里面的内容,这两个引用里面的内容当然不相等,而且永远不会相等,所以打印出来的结果肯定是false

System.out.println("u1.equals(u2)结果是:"+u1.equals(u2));// 结果为true :因为我们在User类里面重写了equals()方法,改变了这个方法默认的实现,我们把方法的实现改为只要这个两个对象是真的存在,并且都是User对象,并且它们的年龄(age),体重(tz)都相同,那么这两只User对象在逻辑上就是一模一样的,是完全相同的两只User,即这两只User是"相等"的。所以这里打印出来的结果是true。

三、如何比较两个字符串对象是否相等?

看下面例子

这一次是比较两个字符串对象是否相等:

System.out.println(a1 == a2);

打印出来的结果依然是fase,因为这里比较的是a1和a2两个字符串对象的引用,两个对象的引用永远不会相等,所以打印出来的结果为false。

System.out.println(a1.equals(a2));

打印出来的结果为true,因为在String类里面重写了从Object类继承(所有的类都是从Object类继承下来,String类当然也不例外,从父类继承下来就拥有了父类的一切属性与方法,所以Sting类里面也有equals()方法,并且还把这个继承下来的equals()方法重写了)下来的equals()方法,改变了这个方法默认的实现,

在String类里面是这样重写equals()方法的实现的:用当前的这个字符串对象和指定的字符串对象比较,指定的字符串对象不能为空并且这个对象的字符序列和当前这个字符串对象的字符串序列一样,如果这些条件都满足,那么这两个字符串对象就是相等的。

因此这里的a2已经满足了条件,所以打印出来的结果是true。

四、总结:

比较两个对象是否相等,我们采用equals()方法,判断两个对象是否相等的条件是由我们重写equals()方法的实现后定义的,这样就可以比较灵活地使用equals()方法在不同的类里面比较位于同一类下的两个对象是否相等了。

本文内容由快快网络小心创作整理编辑!