博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【java基础】 == 和 equals() 的区别
阅读量:4464 次
发布时间:2019-06-08

本文共 1893 字,大约阅读时间需要 6 分钟。

==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 

首先,==号在比较基本数据类型(指的值类型)时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值

int x = 10;int y = 10;String str1 = new String("abc");String str2 = new String("abc");System.out.println(x == y); // 输出trueSystem.out.println(str1 == str2); // 输出false

那equals()方法呢?我们可以通过查看源码知道,equals()方法存在于Object类中,因为Object类是所有类的直接或间接父类,也就是说所有的类中的equals()方法都继承自Object类,而通过源码我们发现,Object类中equals()方法底层依赖的是==号,那么,在所有没有重写equals()方法的类中,调用equals()方法其实和使用==号的效果一样,也是比较的地址值,然而,Java提供的所有类中,绝大多数类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值:

public class Test {    public static void main(String[] args) {        Student s1 = new Student(23);        Student s2 = new Student(23);        System.out.println(s1.equals(s2));    }}class Student{    private int age;    public Student(){}    public Student(int age){        this.age = age;    }}

这里自定义了一个Student类,没有重写equals()方法,最后的输出结果是:false

class Student{    private int age;    public Student(){}    public Student(int age){        this.age = age;    }    @Override    public boolean equals(Object obj){        if (obj instanceof Student) {            Student stu = (Student) obj;            return this.hashCode() == stu.hashCode();        }        return false;    }    @Override    public int hashCode(){        return this.age;    }}

在重写了equals()方法后,输出结果变成了true。

现在一些基本的已经讲的差不多了,接下来我们回到第一个例子:

String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1.equals(str2));System.out.println(str1 == str2);

根据上面所讲,第一个是true,第二个是false,确实如此,那继续看下面的例子:

String s1 = "abc";String s2 = "abc";System.out.println(s1.equals(s2));System.out.println(s1 == s2);

这次的结果和上一个的是一样的吗?答案是:true true 

为什么第二个会是true呢? 
这就涉及到了内存中的常量池,常量池属于方法区的一部分,当运行到s1创建对象时,如果常量池中没有,就在常量池中创建一个对象”abc”,第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。

那上一个例子中的

String str1 = new String("abc");

是怎么回事呢? 

这里其实创建了两次对象,所以str1和str2的地址值不相等。

 

转载于:https://www.cnblogs.com/snaildev/p/9356145.html

你可能感兴趣的文章
mongodb安装4.0(rpm)
查看>>
DispatcherServlet的url mapping为“/”时,对根路径访问的处理
查看>>
备忘pwnable.kr 之passcode
查看>>
好久没敲代码了,手有点生——一个小小的时钟
查看>>
运算符 AS和IS 的区别
查看>>
(转)详解C中volatile关键字
查看>>
easyui时的时间格式yyyy-MM-dd与yyyy-MM-ddd HH:mm:ss
查看>>
专题:动态内存分配----基础概念篇
查看>>
Codeforces Round #426 (Div. 2) (A B C)
查看>>
The Most Simple Introduction to Hypothesis Testing
查看>>
UVA10791
查看>>
P2664 树上游戏
查看>>
jQuery 停止动画
查看>>
Sharepoint Solution Gallery Active Solution时激活按钮灰色不可用的解决方法
查看>>
教你50招提升ASP.NET性能(二十二):利用.NET 4.5异步结构
查看>>
lua连续随机数
查看>>
checkstyle使用介绍
查看>>
会了这十种Python优雅的写法,让你工作效率翻十倍,一人顶十人用!
查看>>
二维码图片生成
查看>>
在做操作系统实验的一些疑问
查看>>