zoukankan      html  css  js  c++  java
  • Java学习笔记之==与equals

    一、问题引入

    Java测试两个变量是否相等有两种方式:==运算符和equals方法。

    但是这二者完全一样吗?考虑下面程序:

     1 public class TestEqual 
     2 {
     3     public static void main(String[] args)
     4     {
     5         int it = 65;
     6         float f1 = 65.0F;
     7         System.out.println("65和65.0是否相等? " + (it == f1));
     8         char ch = 'A';
     9         System.out.println("65和'A'是否相等? " + (it == ch));
    10         
    11         String str1 = new String("hello");
    12         String str2 = new String("hello");
    13         System.out.println("str1和str2是否相等? " + (str1 == str2));
    14         System.out.println("str1和是equals str2? " + (str1.equals(str2)));
    15     }
    16 }

    输出:

    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方法本质上与==一样,这就导致,这个方法没有太大的实际意义,若果像==运算符那样严格的标准比较引用变量,估计实际中很少有两个引用变量会相等,所以这个方法(如果需要的话)常常在我们建立一个类时,就会重写该方法,自己定义一套合理的相等判断标准即可。

  • 相关阅读:
    解上三角矩阵和下三角矩阵方程的fortran程序
    用sublimetext写fortran程序
    fortran子程序传入可变数组要在module里实现
    ubuntu wineqq 输入中文显示方格的问题
    mathtype快捷键很方便+公式上边不显示问题的解决
    滚动字符小程序-python
    传递矩阵法求简支梁固有频率的近似解 --matlab程序
    explorer.exe总是重启导致打开的文件夹关闭
    python把数据分为训练部分和测试部分的简单实现
    用python批量删掉文件名中共同存在的字符
  • 原文地址:https://www.cnblogs.com/90zeng/p/Java_equals.html
Copyright © 2011-2022 走看看