应该会有不少初学的小伙伴上来就说:==比较的是地址值,equals比较的是值。这样回答对吗?

下面详细说下两者的区别。

==运算符

  • 对于基本数据类型来说,比较的是数值
  • 对于引用数据类型来说,比较的是地址值

下面代码示例了使用==来判断两种类型变量是否相等的结果。

public class EqualTest {

    // ==
// 对于基本数据类型,比较的是值
public static void main(String[] args) {
int a = 65;
double b = 65.0;
char c = 'A';
String str1 = new String("helloworld");
String str2 = new String("helloworld"); System.out.println(a == b); //true
System.out.println(c == a); // true
// 因为str1和str2是2个对象,地址值不一样,输出false
System.out.println(str1 == str2);
} }

equals方法

首先应该明确,equals是一个方法,只有对象才能调用,基本数据类型不能使用equals方法。其次,equals方法是定义在java.lang.Object类中的,Object类是所有类的超级父类,所以,每个对象都默认有一个继承自Object类的equals方法。

我们来看下Object类中的equals方法定义:

    public boolean equals(Object obj) {
return (this == obj);
}

可以看到,equals方法底层也是使用==来进行比较的

假设有一个自定义的User类,它有一个name成员变量,有一个初始化name成员变量的构造器。现在我们新建两个这样的User对象,其name属性都初始化为TOM,然后通过继承自Object类的equals方法,进行两个对象的比较。代码如下:

	User user1 = new User("TOM");
User user2 = new User("TOM");
System.out.println(order1.equals(order2));

刚才说到,equals方法比较的是引用数据类型变量的地址值,由于user1user2是两个不同的对象,其地址值不一样,所以上面代码会输出false

继续看下面代码:

	String str1 = new String("程序员技术之瞳");
String str2 = new String("程序员技术之瞳");
System.out.println(str1.equals(str2));

这次我们比较的是两个字符串,字符串的比较大家肯定很熟悉了,显然,上面代码会输出true

那么,问题来了。String和我们自定义的Order类都是引用类型,为什么两者通过equals方法进行比较,输出结果不一样呢?

答案是:String重写了Objectequals方法,在重写的equals方法中,比较的是字符串的字符序列是否相等。上述str1和str2的字符序列都是“程序员技术之瞳”,所以会输出为true

总结

下次面试官再问这个问题,可以这样回答:

  1. ==:当比较的是基本数据类型时,比较的是值;当比较的是引用数据类型时,比较的是地址值。
  2. equals:equals不能用于基本数据类型的比较;当比较的是引用数据类型时,默认也是比较地址值,只不过像StringDateFile、包装类等都重写了Object类中的equals方法,重写后比较的不再是两个对象的地址值,而是自定义的相等标准(可以是某一个或某几个属性值相等)。在实际项目开发中,常常需要重写equals方法,相等条件由业务决定。

==和equals的区别,85%的求职者“理直气壮”地回答错误的更多相关文章

  1. 关于==和equals的区别和联系,面试这么回答就可以

    长篇大论的话,我这里就不多写了,相信大家入门java 的时候就知道个大概了,这里想表述的是,如果面试官问你<关于==和equals的区别>,该怎么回答完美呢?可以这样说 总结的来说: 1) ...

  2. Java学习笔记——双等号和equals的区别

    一.==和equals的区别 1. ==可以用来比较基本类型和引用类型,判断内容和内存地址 2. equals只能用来比较引用类型,它只判断内容.该函数存在于老祖宗类 java.lang.Object ...

  3. java中的==和equals的区别

    关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...

  4. android错误之==与equals的区别

    在做一个电话号码匹配的时候, 开始我使用的是这种情况 if (num == inCall.getNum()) { //操作... } 但是无论如何结果都是false,就算两个号码打印出来一模一样还是f ...

  5. Java基础系列之你真的懂==与equals的区别吗?

    对于Java初学者而言,可能会对这两个比较方法比较模糊,有的人可能会觉得两个的方法使用起来结果是一样的等.如果你有这样的想法,我建议你来看看这边博客,让你充分了解这两个比较的异同,以及他们底层是如何比 ...

  6. Java 中 == 和 equals 的区别

    有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...

  7. java 的==和equals的区别(二)

    java 的==和equals的区别 java 的==和equals的区别 ==通常表明引用的是同一个东西(引用的地址相同),equals通常表明两个对象的内容相同(值相同) ------------ ...

  8. equals与==区别

    equals与==区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间 ...

  9. “==”与equals的区别

    “==”与equals的区别: “==”:两个对象比较的是对象的引用地址比较,对象的hashCode值是对象的引用地址,只有两个对象的hashCode值一样,此比较符才会返回true,否则即使两个对象 ...

随机推荐

  1. 认识Docker

      以下是个人学习过程中所记,仅作为学习经历和备忘,有问题不负责,但可以交流和探讨. 1 什么是Docker?   在Docker的官网,Docker的设计师们对Docker的定义是:   Docke ...

  2. 事务 ( 进程 ID 60) 与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品

    Select * FROM [TableName] With(NoLock) .....

  3. spring cloud之eureka简介

    最近线上的接口出了一些问题,有一些可能不是代码的问题,但是由于是测试和其他方面的同事爆出来的,所以感觉对接口的监控应该提上日程. 经过搜索发现,spring cloud的eureka就是专门做这方面工 ...

  4. abp(net core)+easyui+efcore仓储系统——展现层实现增删改查之控制器(六)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...

  5. Laravel --- 如何较优雅的使用公用函数

    一.创建公用文件 App/Helpers/CommonHelper.php 二.创建Provider php artisan make:provider HelperServiceProvider C ...

  6. SpringBoot项目多数据源配置

    博主总结的不错,事务也考虑到了,存一下: https://blog.csdn.net/xqnode/article/details/86498507

  7. laravel配置不同环境的配置文件

    //在入口bootstrap/App.php中 $env = $app->detectEnvironment( function () use ($app) { $uname = php_una ...

  8. 强制等待&隐士等待&显示等待&元素定位方法封装

    前言 问题 学习selenium的同学估计大多数都遇见过一个问题 明明页面已经精准的定位到了元素,但是执行脚本的时候却经常报错没找到元素.其实原因很简单,就是脚本执行的速度很快,而浏览器加载页面的时候 ...

  9. 并发编程-concurrent指南-Lock

    既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述.本文先从synchronized的缺陷讲起,然后再讲述java.util.concurr ...

  10. 常用的URL Scheme

    系统 短信 sms:// app store itms-apps:// 电话 tel:// 备忘录 mobilenotes:// 设置 prefs:root=SETTING E-Mail MESSAG ...