==和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,否则即使两个对象 ...
随机推荐
- 认识Docker
以下是个人学习过程中所记,仅作为学习经历和备忘,有问题不负责,但可以交流和探讨. 1 什么是Docker? 在Docker的官网,Docker的设计师们对Docker的定义是: Docke ...
- 事务 ( 进程 ID 60) 与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品
Select * FROM [TableName] With(NoLock) .....
- spring cloud之eureka简介
最近线上的接口出了一些问题,有一些可能不是代码的问题,但是由于是测试和其他方面的同事爆出来的,所以感觉对接口的监控应该提上日程. 经过搜索发现,spring cloud的eureka就是专门做这方面工 ...
- abp(net core)+easyui+efcore仓储系统——展现层实现增删改查之控制器(六)
abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...
- Laravel --- 如何较优雅的使用公用函数
一.创建公用文件 App/Helpers/CommonHelper.php 二.创建Provider php artisan make:provider HelperServiceProvider C ...
- SpringBoot项目多数据源配置
博主总结的不错,事务也考虑到了,存一下: https://blog.csdn.net/xqnode/article/details/86498507
- laravel配置不同环境的配置文件
//在入口bootstrap/App.php中 $env = $app->detectEnvironment( function () use ($app) { $uname = php_una ...
- 强制等待&隐士等待&显示等待&元素定位方法封装
前言 问题 学习selenium的同学估计大多数都遇见过一个问题 明明页面已经精准的定位到了元素,但是执行脚本的时候却经常报错没找到元素.其实原因很简单,就是脚本执行的速度很快,而浏览器加载页面的时候 ...
- 并发编程-concurrent指南-Lock
既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述.本文先从synchronized的缺陷讲起,然后再讲述java.util.concurr ...
- 常用的URL Scheme
系统 短信 sms:// app store itms-apps:// 电话 tel:// 备忘录 mobilenotes:// 设置 prefs:root=SETTING E-Mail MESSAG ...