==和equals的区别,85%的求职者“理直气壮”地回答错误
应该会有不少初学的小伙伴上来就说:==
比较的是地址值,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
方法比较的是引用数据类型变量的地址值,由于user1
和user2
是两个不同的对象,其地址值不一样,所以上面代码会输出false
。
继续看下面代码:
String str1 = new String("程序员技术之瞳");
String str2 = new String("程序员技术之瞳");
System.out.println(str1.equals(str2));
这次我们比较的是两个字符串,字符串的比较大家肯定很熟悉了,显然,上面代码会输出true
。
那么,问题来了。String
和我们自定义的Order
类都是引用类型,为什么两者通过equals
方法进行比较,输出结果不一样呢?
答案是:String
重写了Object
的equals
方法,在重写的equals
方法中,比较的是字符串的字符序列是否相等。上述str1和str2的字符序列都是“程序员技术之瞳”,所以会输出为true
。
总结
下次面试官再问这个问题,可以这样回答:
- ==:当比较的是基本数据类型时,比较的是值;当比较的是引用数据类型时,比较的是地址值。
- equals:equals不能用于基本数据类型的比较;当比较的是引用数据类型时,默认也是比较地址值,只不过像
String
、Date
、File
、包装类等都重写了Object
类中的equals
方法,重写后比较的不再是两个对象的地址值,而是自定义的相等标准(可以是某一个或某几个属性值相等)。在实际项目开发中,常常需要重写equals
方法,相等条件由业务决定。
==和equals的区别,85%的求职者“理直气壮”地回答错误的更多相关文章
- 关于==和equals的区别和联系,面试这么回答就可以
长篇大论的话,我这里就不多写了,相信大家入门java 的时候就知道个大概了,这里想表述的是,如果面试官问你<关于==和equals的区别>,该怎么回答完美呢?可以这样说 总结的来说: 1) ...
- Java学习笔记——双等号和equals的区别
一.==和equals的区别 1. ==可以用来比较基本类型和引用类型,判断内容和内存地址 2. equals只能用来比较引用类型,它只判断内容.该函数存在于老祖宗类 java.lang.Object ...
- java中的==和equals的区别
关于JAVA中的==和equals函数的区别 今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指 ...
- android错误之==与equals的区别
在做一个电话号码匹配的时候, 开始我使用的是这种情况 if (num == inCall.getNum()) { //操作... } 但是无论如何结果都是false,就算两个号码打印出来一模一样还是f ...
- Java基础系列之你真的懂==与equals的区别吗?
对于Java初学者而言,可能会对这两个比较方法比较模糊,有的人可能会觉得两个的方法使用起来结果是一样的等.如果你有这样的想法,我建议你来看看这边博客,让你充分了解这两个比较的异同,以及他们底层是如何比 ...
- Java 中 == 和 equals 的区别
有一段时间,== 和 equals 的区别一直困扰着我.因为涉及到Java的内存机制,然而Java的内存机制又是比较抽象的东西,所以对那时候的我来说,实在是很难理解. == 和 equals 最大的区 ...
- java 的==和equals的区别(二)
java 的==和equals的区别 java 的==和equals的区别 ==通常表明引用的是同一个东西(引用的地址相同),equals通常表明两个对象的内容相同(值相同) ------------ ...
- equals与==区别
equals与==区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间 ...
- “==”与equals的区别
“==”与equals的区别: “==”:两个对象比较的是对象的引用地址比较,对象的hashCode值是对象的引用地址,只有两个对象的hashCode值一样,此比较符才会返回true,否则即使两个对象 ...
随机推荐
- 所有W版本的函数都在wchar.h文件(_wfopen),和stdlib.h文件(wcstombs),和stdio.h文件(vwprintf)
C:\Qt\Qt5.6.2\Tools\mingw492_32\i686-w64-mingw32\include\wchar.h C:\Qt\Qt5.6.2\Tools\mingw492_32\i68 ...
- [java代码库]-简易计算器(第二种)
[java代码库]-简易计算器(第二种) 第二种方案:在程序中不使用if/switch……case等语句,完成计算器功能. <html> <head> <title> ...
- linux dll hell--链接库real name, soname, link name
DLL hell 是指 Windows 系统上动态库的新版本覆盖旧版本,且新版本不能兼容旧版本的问题. 例如:装新软件,但原有的软件运行不起来了. Linux 系统下也同样面临着和 Windows ...
- 基于ASP.NET的新闻管理系统(一)
1. 项目简介 1.1设计内容 (1)可以在首页查看各类新闻,可以点击新闻查看具体内容:可以查看不同类型的新闻,并了解热点新闻,可以在搜索框里输入要查找的内容. (2)在后台界面中,管理员可以修改密码 ...
- python中的变量,字符串,用户交互,if语句
一:python介绍 python的创始人为吉多·范罗苏姆,创始时间是1989年. 1python是一门什么样的语言 python是一门解释型弱类型语言★ 弱类型:弱类型的变量可以变,强类型的变量不能 ...
- TCP使用注意事项总结
目录 发送或者接受数据过程中对端可能发生的情况汇总 本端TCP发送数据时对端进程已经崩溃 本端TCP发送数据时对端主机已经崩溃 本端TCP发送数据时对端主机已经关机 某个连接长时间没有数据流动 TCP ...
- 简单学习js
由于是个前端小白,通过这一两天的学习html,css,js和jquery等,基本上前端会用了,而且熟悉我博客的人来说,没错,我把自己的博客给优化了一下(一些大佬都是禁用模板的所有样式,然后自己设计页面 ...
- 实现h5公众号分享功能(vue项目也适用)
在vue项目中我们先npm install weixin-js-sdk --save下载下来在main.js文件中引入 import wx from 'weixin-js-sdk';//引入 Vue. ...
- kuberbetes基础概念
部署了一大堆,来了解一下K8S一些基本的概念. 1.Node Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod.Node上运行着Kubern ...
- MacBook强制清除gardle缓存
背景:在日常的工作开发中,为了方便维护一般采用gardle+Nexus的模式管理jar包,但方便的同时也会存在一些问题 例如:test-1.0.3.jar jar包提供方修改了一些问题上传到Nexu ...