Java学习笔记之==与equals
一、问题引入
Java测试两个变量是否相等有两种方式:==运算符和equals方法。
但是这二者完全一样吗?考虑下面程序:
public class TestEqual
{
public static void main(String[] args)
{
int it = 65;
float f1 = 65.0F;
System.out.println("65和65.0是否相等? " + (it == f1));
char ch = 'A';
System.out.println("65和'A'是否相等? " + (it == ch)); String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是否相等? " + (str1 == str2));
System.out.println("str1和是equals str2? " + (str1.equals(str2)));
}
}
输出:
65和65.0是否相等? true
65和'A'是否相等? true
str1和str2是否相等? false
str1和是equals str2? true
由程序结果可以看出:
- 使用==来判断2个基本类型的的变量(不要求这两个变量类型一样,但二者都必须是基本类型),则只要两个变量字面值相等,使用==判断就会返回true,5-9行代码及其输出说明了这个问题
- 对于引用类型变量,必须两个变量指向同一个对象时,==才会返回ture,否则false,11-13行代码及其输出说明了这个问题
对于代码13行的判断,显然“不是很合理”,因为直觉上,二者就是一样的啊,这就是我们经常遇到的判断两个引用变量是否相等时,并不严格要求两个引用变量指向同一个对象,如上面程序中的两个字符串变量,只要二者引用的字符串对象里包含的字符序列相同即可认为相等,此时就需要用到equals方法,上述代码最后一行就是如此,结果返回true.
二、再看equals
equals方法是Object类提供的一个实例方法,因此所有引用变量都可调用该方法来判断与其他引用变量是否相等。
真相是残酷的:其实在判断两个引用变量(不是基本类型的变量哦,其实equals是不能够用来判断基本类型变量的)是否相等的时候,equals方法与==是一样的,即只有两个引用变量指向同一个对象时才会返回true. 这……上面的情况怎么解释?
众所周知,所有类都是Object类的子类,所以所有子类都可以重载父类的方法,其实String重写了父类Object类中的equals方法,自己整了一个标准:只要两个字符串包含的字符序列相同就返回true,否则false.( 学了C++的孩子可能会说,我重载==运算符,不重载equals方法,不可以吗,遗憾的是Java是没有运算符重载的)。
很容易看出来,因为Object类提供的equals方法本质上与==一样,这就导致,这个方法没有太大的实际意义,若果像==运算符那样严格的标准比较引用变量,估计实际中很少有两个引用变量会相等,所以这个方法(如果需要的话)常常在我们建立一个类时,就会重写该方法,自己定义一套合理的相等判断标准即可。
Java学习笔记之==与equals的更多相关文章
- Java学习笔记13(equals()方法;toString()方法)
equals()方法: equals方法是Object类中的方法:Object是所有类的祖宗,所以所有类都有equals()方法: boolean equals(Object obj); equals ...
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 20145330第五周《Java学习笔记》
20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...
- Java学习笔记——动态代理
所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...
- Java学习笔记4
Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...
- java学习笔记05--字符串 .
java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...
- java学习笔记04--数组
java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...
- java学习笔记13--比较器(Comparable、Comparator)
java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ...
随机推荐
- asp.net读取xml方法
这个适合刚学asp.net的同学,大神直接略过好了,asp.net经常会有很多用到XML的地方,比如全国省市的联动,以及一些菜单读取等等都有xml的影子,直接贴代码,以便我以后用到的时候忘了,注释我写 ...
- Unreal Engine 虚幻引擎宣布对开发者免费
虚幻引擎4现在可供每个人免费使用,而且所有未来的更新都将免费!您可以下载引擎并将其用于游戏开发的各个方面,包括教育.建筑以及可视化,甚至虚拟现 实.电影和动画. 当您发布游戏或应用时,在您的每个游戏在 ...
- 【LeetCode】223 - Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...
- 星星字体 ps教程
本教程主要使用Photoshop制作绚丽星空装饰的艺术字教程,这个教程很简单,只需要一些简单技巧,即可做出海报.书籍杂志的封面效果.其中的字体.笔刷和背景均可以更换 教程所需要的素材链接:http:/ ...
- arp spoofing
Today our tutorial will talk about Kali Linux Man in the Middle Attack. How to perform man in the mi ...
- 【开源项目之路】jquery的build问题
在刚开始clone了jquery到本地build的时候,就遇到了问题. “ENORESTARGET No tag found that was able to satisfy ...” 提示为bowe ...
- Flex 对Java端返回Collection的处理方法
将Flex与Spring集成后(BlazeDS 与Spring集成指南 ),第一个面临的问题就是:对于Java端返回的各种Java类型的对象,Flex中能否有相应的数据类型来映射. 处理,尤其是Lis ...
- AIR 3.0针对移动设备的高性能渲染方案
转自:http://blog.domlib.com/articles/242.html 当我们一边正在等待Stage3D的发布时,很多开发者似乎还停留在这个印象中:即使AIR 3.0也无法在移动设备上 ...
- ESB后台error日志
本地tomcat没异常 开发环境,生产环境 ESB使用axis2.jar 后台会有错误,但不影响所有流程,该错误源自common.log的error,在捕捉异常后,并未往外继续抛 [ESB 打印] 接 ...
- 创建svn仓库脚本
#!/bin/bash svnadmin create $1 cp /home/svndata/conf/svnserver.conf /home/svndata/$1/conf/svnserve.c ...