正确的使用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 。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/33594.html