Java中equals()方法和==的区别

1、 数据类型

1.1 基本类型

基本类型 是Java中预定义的类型,有相应的保留关键字来表示,具有明确的取值范围和数学行为,表示了真实的数字、字符和整数。基本类型的数据都是单个值,而不是复杂的对象,所以基本类型并不是面向对象的,这主要是出于效率方面的考虑。但是同时Java中也为基本类型提供了对应的对象版本,即基本类型的包装类(wrapper)。我们可以直接使用这些基本类型,也可以使用基本类型的构造数组或者其他自定义类型。1
Java提供了八种基本数据类型,其中有六种数字类型,一种字符类型和一种布尔型。2

详细数据如下表:3

类型大小数据范围
byte1字节(8位) [-27, 27-1]
short2字节(16位) [-215, 215-1]
int4字节(32位) [-231, 231-1]
long8字节(64位) [-263, 263-1]
float4字节(32位) [-3.4*1038, 3.4*1038]
double8字节(64位) [-1.8*10308, 1.8*10308-1]
char2字节(16位) [\u0000, \uffff]
booleanJava规范没有明确的规定,不同的JVM有不同的实现机制

1.2 引用类型

引用类型中的引用,一般是指某个对象的内存地址,其中对象是动态创建的类实例或者动态创建的数组,另外Java语言本身不支持C++中的结构体(struct) 或联合体(union) 等数据类型,这种复合数据类型一般都是通过类或接口进行构造。1

2、比较方式

2.1 == 的比较方式

如果两个比较对象均为基本类型,侧比较的是数值是否相等。
如果两个比较对象均为引用类型,比较的是两者的地址是否相同。4

2.2 equals()的比较方式

没有重写equals()时,Object默认以==来实现,即比较两个对象的内存地址是否相同。4
但是对于对象来说,我们关注的其实是对象的内容是否相同,所以我们可以通过重写equals()来将比较转换为我们想要的结果,比如只比较两个对象的成员变量的值是否相同。

3、重写equals()

我们只需要在定义类时重写equals()方法即可。 比如现在我有一个学生类student

class Student{
    private String id;      //学号,所有学生学号唯一
    private String name;    //姓名
    private String age;     //年龄
}

我的需求是判断某两个类描述的是否是同一个学生。我可以直接判断学生的学号是否相同即可,若学号相同则为同一个学生。那么在实现成员变量的get/set方法后,我可以这么重写equals()方法

@Override
public boolean equals(Object obj) {
    // 比较的类是否就是自己
    if(this==obj){
        return true;
    }
    // 比较的类的类型是否是Student的实例
    if(obj instanceof Student){
        Student student = (Student)obj;
        // 返回id的比较结果
        return this.id.equals(student.getId());
    }
    return false;
}

其中,我也使用了String的equals()方法,我们可以从String类的源码中找到相关的代码,如下

public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
if (anObject instanceof String) {
    String anotherString = (String)anObject;
    int n = value.length;
    if (n == anotherString.value.length) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = 0;
        while (n-- != 0) {
            if (v1[i] != v2[i])
                return false;
            i++;
        }
        return true;
    }
}
return false;
}

值得注意的是,String类在java9版本中从char类型实现改为byte类型实现5,以此来节约String占用的内存。很明显以上代码中的String类是用char类型实现的。

4、总结

= = == ==有两种比较方式,比较基本类型的数值和比较引用类的地址。
equals()方法默认是以 = = == ==来实现,我们也可以在平常的需求中重写equals()方法。


  1. Java里的数据类型有哪些? ↩︎ ↩︎

  2. Java 基本数据类型 ↩︎

  3. 1.4 介绍一下Java的数据类型 ↩︎

  4. 1.23 ==和equals()有什么区别? ↩︎ ↩︎

  5. jdk9为何要将String的底层实现由char[]改成了byte[]? ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值