应该会有不少初学的小伙伴上来就说:==比较的是地址值,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. CMake编译Qt程序+UI+Resources

    今天给大家讲解一下Cmake如何编译Qt程序. 这里说的Qt程序不只是用QtCreator写出来的程序,当然也可以是文本编辑器….这里说的Qt程序是指,QCoreApplication,QApplic ...

  2. Qt+VS编译器:默认库“library”与其他库的使用冲突;使用 /NODEFAULTLIB:library(我曾经碰到过,修改qmake.conf,但我修改的是VS的IDE配置)good

    找到qt安装目录下的mkspecs文件夹,在里面找到你使用的对应版本编译器,打开qmake.conf.稍等: /MD:动态链接多线程库(msvcrt.lib).使用该选项时,需要用/NODEFAULT ...

  3. javascript 实现ajax

    AJAX 英文名称 Asynchronous JavaScript and XML即异步的 JavaScript 和 XML AJAX 是与服务器交换数据并更新部分网页一门无刷新技术构建自己的ajax ...

  4. vue-cli脚手架 ,过滤器,生命周期钩子函数

    一.安装vue-cli脚手架 1.淘宝镜像下载 用淘宝的国内服务器来向国外的服务器请求,我们向淘宝请求,而不是由我们直接向国外的服务器请求,会大大提升请求速度,使用时,将所有的npm命令换成cnpm即 ...

  5. System.arraycopy 和 Arrays.copyOf

    System.arraycopy /* native关键字 本地方法 System类 java.lang.System.class 参数说明: src - 源数组. srcPos - 源数组中的起始位 ...

  6. spring cloud 系列第4篇 —— feign 声明式服务调用 (F版本)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.feign 简介 在上一个用例中,我们使用ribbon+restTem ...

  7. Java NIO 学习笔记(二)----聚集和分散,通道到通道

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  8. JavaWeb入门_模仿天猫整站Tmall_SSM实践项目

    Tmall_SSM 技术栈 Spring MVC+ Mybatis + Spring + Jsp + Tomcat , 是 Java Web 入门非常好的练手项目 效果展示: 模仿天猫前台 模仿天猫后 ...

  9. 长春理工大学第十四届程序设计竞赛(重现赛)J

    J.Printout 题目:链接:https://ac.nowcoder.com/acm/contest/912/J 题目: 小r为了打校赛,他打算去打字社打印一份包含世界上所有算法的模板. 到了打字 ...

  10. 给VS设置代码创建人的宏

    Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...