您的位置:首页 > 编程语言 > Java开发

java学习笔记23:==和equals()方法的区别、equals方法的重写、阅读Object和String的源码

2019-01-23 17:13 465 查看
版权声明:本文为博主原创/转载的文章,仅作为学习交流使用。欢迎广大网友前来交流学习指正教导,愿我们共同进步。 https://blog.csdn.net/qq_42770701/article/details/86614128

一、“==”和equals()方法的区别以及equals()方法的重写

1、“= =”和equals()方法
  
  “==”代表比较双方是否相同。
  如果是基本类型则表示值相等;
  如果是引用类型则表示地址相等即是同一个对象。
  
  Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。比如,我们在公安系统中认为id相同的人就是同一个人、学籍系统中认为学号相同的人就是同一个人。
  
2、重写equals()方法
  Object 的 equals 方法默认就是比较两个对象的hashcode(默认看地址是否相同),是同一个对象的引用时返回 true 否则返回 false。但是,我们可以根据我们自己的要求重写equals方法。

示例:重写equals()方法

/**
*
* @Title: TestEquals.java
* @Package test
* @Description: TODO(测试、重写equals()方法)
* @author Charlie
* @date 2019年1月23日
* @version V1.0
*/
package test;

/**
* @ClassName: TestEquals
* @Description: TODO(测试、重写equals()方法)
* @author Charlie
* @date 2019年1月23日 下午3:55:36
*
*/
public class TestEquals {

/**
* @Title: main
* @Description: TODO(测试、重写equals()方法)
* @param @param args    参数
* @return void    返回类型
* @throws
*/
public static void main(String[] args) {
Object obj;
String str;

User u1 = new User(123, "老大", "123456");
User u2 = new User(123, "老二", "1234567");

//重写equals()方法前(使用默认的object的equals()方法),判断u1和u2是否相等,
//  结果都为false,因为引用的地址是两个不同的对象
//重写equals()方法后(使用下面的equals()重写方法,判断u1和u2是否相等,结果:
//  ==为false(因为不是同一个对象),equals为true(因为只比较id,是同一个值)
System.out.println(u1 == u2);
System.out.println(u1.equals(u2));

//比较String类
String s1 = new String("Charlie");
String s2 = new String("Charlie");

System.out.println(s1 == s2);    //false:比较的是两个不同的对象
System.out.println(s1.equals(s2));    //true:比较的是Charlie,完全相同
}
}

/**
*
* @ClassName: User
* @Description: TODO(定义User类)
* @author Charlie
* @date 2019年1月23日 下午4:05:30
*
*/
class User{
int id;
String name;
String pwd;

//重写User构造器,可以类内鼠标右键→Source→Generate Constructor using Fileds...
public User(int id, String name, String pwd) {
super();
this.id = id;
this.name = name;
this.pwd = pwd;
}

//自动生成时提供一个散链码,写不写都行
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
return result;
}

//重写Object里的equals()方法
//现在只根据id进行判断,这里传的值是Object类型,需要转型,
//可以类内鼠标右键→Source→Generate hashCode() and equals()...自动生成
@Override
public boolean equals(Object obj) {

if (this == obj)    //如果传递的object和我相等,则返回true
return true;
if (obj == null)    //如果传递的object为空,则返回false
return false;
if (getClass() != obj.getClass())    //如果传递的object类型不同,则返回false
return false;
User other = (User) obj;    //如果上面都通过,则在这里强制转型为User
if (id != other.id)    //如果传递的object的id和我不相等,则返回false
return false;
return true;    //如果上面都能顺利通过,则最后返回true
}
}

运行结果:

二、阅读Object、String源码

1、按Ctrl点击Object,可以找到里面有equals()方法

注:equals()方法使用时需要传个参数Object obj;
  return (this == obj) 默认比较这两个的hashCode的地址是否相同,看是否是同一个对象,是则返回true,否则返回false

2、同1进入String类,里面也重写了equals()方法

如果两者相等,则返回true;
如果是String类型,则一直判断,对字符串内容的每一个字符进行比较,如果相同则返回true;
最后返回false。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: