许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Java equals方法详解

Java equals方法详解

阅读数 8
点赞 0
article_banner

正确的使用equals方法:

Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

举个例子:

// 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常String str = null;if (str.equals("SnailClimb")) {  ...} else {  ..}

运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。

"SnailClimb".equals(str);// false 

不过更推荐使用 java.util.Objects#equals(JDK7 引入的工具类)。

Objects.equals(null,"SnailClimb");// false

看一下java.util.Objects#equals的源码就知道原因了。

public static boolean equals(Object a, Object b) {    // 可以避免空指针异常。如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。    return (a == b) || (a != null && a.equals(b));}

String对象的equals方法的源代码:

public boolean equals(Object anObject) {        //anObject为被比较的对象,        //第一步:先判断比较对象与被比较对象地址是否一致,若地址一致则返回true        if (this == anObject) {            return true;        }        //第二步:若地址不一致继续判断被比较对象类型是否为String类型,若是则判断内容是否一致,一致返回true        if (anObject instanceof String) {            String anotherString = (String)anObject;            int n = value.length;            if (n == anotherString.value.length) {                char v1[] = value;                char v2[] = anotherString.value;                int i = 0;                while (n-- != 0) {                    if (v1[i] != v2[i])                        return false;                    i++;                }                return true;            }        }        //第二步类型不一致则直接返回false        return false;    }

Integer对象的equals方法源码:

public boolean equals(Object obj) {        //判断被比较对象的类型是否为Integer        if (obj instanceof Integer) {            //对象类型一致则返回两对象的值是否相等            return value == ((Integer)obj).intValue();        }        //否则返回false        return false;    }

测试:

package src.main; public class Test {    public static void main(String []args)    {        String test1="zhao";        String test2="zhao";        System.out.println("test1==test2输出:"+(test1==test2));        System.out.println("test1.equals(test2)输出:"+test1.equals(test2));         Integer test3=new Integer(10);        Integer test4=new Integer(10);        System.out.println("test3==test4输出:"+(test3==test4));        System.out.println("test3.equals(test4)输出:" + test3.equals(test4));        // 输出结果:// test1==test2输出:true //说明test1和test2的内存地址相同// test1.equals(test2)输出:true //说明test1和test2的值相同 // test3==test4输出:false //说明test3和test4的内存地址不同// test3.equals(test4)输出:true //说明test3和test4的值相同    }}

其他自定义对象如果需要可按需求重写equals方法

拓展:

关于此处源码中instanceof关键字的使用:

instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的 实例 ,用法为:

	boolean result = obj instanceof Class

注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。

其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。obj必须为引用类型,基本 数据类型  编译不通过,如果 obj 为 null,那么将返回 false。

用伪代码进行描述:

boolean result;if (obj == null) {  result = false;} else {  try {      T temp = (T) obj; // checkcast      result = true;  } catch (ClassCastException e) {      result = false;  }}

      也就是说有表达式 obj instanceof T,instanceof 运算符的 obj 操作数的类型必须是引用类型或空类型; 否则,会发生编译时错误。如果 obj 强制 转换 为 T 时发生编译错误,则关系表达式的 instanceof 同样会产生编译时错误。 在这种情况下,表达式实例的结果永远为false。在运行时,如果 T 的值不为null,并且 obj 可以转换为 T 而不引发ClassCastException,则instanceof运算符的结果为true。 否则结果是错误的

简单来说就是:如果 obj 不为 null 并且 (T) obj 不抛 ClassCastException 异常则该表达式值为 true ,否则值为 false 。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删


相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空