一、问题引入

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的更多相关文章

  1. Java学习笔记13(equals()方法;toString()方法)

    equals()方法: equals方法是Object类中的方法:Object是所有类的祖宗,所以所有类都有equals()方法: boolean equals(Object obj); equals ...

  2. 0025 Java学习笔记-面向对象-final修饰符、不可变类

    final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...

  3. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  4. 20145330第五周《Java学习笔记》

    20145330第五周<Java学习笔记> 这一周又是紧张的一周. 语法与继承架构 Java中所有错误都会打包为对象可以尝试try.catch代表错误的对象后做一些处理. 使用try.ca ...

  5. Java学习笔记——动态代理

    所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记——RMI&q ...

  6. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

  7. java学习笔记05--字符串 .

    java学习笔记05--字符串 . 一.String类 由字符所组成的一串文字符号被称之为字符串.在java中字符串不仅仅是字符数组,而且是String类的一个实例,可以使用String类来构建. 字 ...

  8. java学习笔记04--数组

    java学习笔记04--数组 数组复制的方法是使用System类提供的arraycopy()方法,其语法如下: System.arraycopy(Object src, int srcPos, Obj ...

  9. java学习笔记13--比较器(Comparable、Comparator)

    java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 ...

随机推荐

  1. 【PHP入门到精通】:Ch03:PHP语言基础

    1, PHP风格 这里为了显示代码把"<"和">"和key值以空格分开了,实际书写时切记不要将其分开: (1) < ?php ? >: ...

  2. EFSQLserver

    1.增加一条烽据 FLYNEWQKEntities dataContext = new FLYNEWQKEntities(); Log log = new Log(); log.Data1 = &qu ...

  3. 【DWT笔记】基于小波变换的降噪技术

    [DWT笔记]基于小波变换的降噪技术 一.前言 在现实生活和工作中,噪声无处不在,在许多领域中,如天文.医学图像和计算机视觉方面收集到的数据常常是含有噪声的.噪声可能来自获取数据的过程,也可能来自环境 ...

  4. 【LeetCode】6 - ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  5. Spring的Bean的作用域

    singleton: * IOC中只存在一个共享的Bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例 *  与单例模式区别:单例设计模式表示一个Cla ...

  6. SAS、R以及SPSS的比较__统计语言大战

  7. 【脚本语言对比】BASH,PERL以及PYTHON

    据说: BASH能调用linux的应用程序,这是其最大的优点,也是其最大的缺点. PERL那复杂的语法确实看得让人想吐. python很优美,但是据说对正则的支持不够,没有perl强大. 总结一下学习 ...

  8. Git 常用操作。

    1.本地文件被修改后,却想要撤销所有的修改. SVN中可以简单地将被修改的文件直接删除,重新Update一下. Git中本以为可以将文件直接删除然后pull一下,然而却是不行的. 可以使用Revert ...

  9. Hadoop学习记录(7)|Eclipse远程调试Hadoop

    1.创建Hadoop项目 2.创建包.类 这里使用hdfs.WordCount为例 3.编写自定Mapper和Reducer程序 MyMapper类 static class MyMapper ext ...

  10. poj 1552 Doubles

    #include <stdio.h> #include <stdlib.h> ]; int cmp(const void *a, const void *b) { return ...