场景:本周在完成一个公司业务功能时,在判断是否为代叫单时调用了equal方法:

PublishOrderType.HELP_ORDER.equals(valetOrderExtraInfoDO.getHelpFlag())

HELP_ORDER为枚举变量,比较的getHelpFlag()返回值为Integer,使得所有情况都返回false,导致业务逻辑错误

  分析原因:equal为java的Object中的方法,因此除了基本类型外其他所有类型都可以调用,Object中方法定义如下:

public boolean equals(Object obj) {
return (this == obj);
}

当不同类型进行比较时,如果不是可以隐式转换,一般返回false。比较时应当比较枚举型的code,代码如下:

PublishOrderType.HELP_ORDER.getCode().equals(valetOrderExtraInfoDO.getHelpFlag())

  equal方法:

  大家都知道,对于内置类型,使用==两边的值大小,而对于超类Object派生的类型,与==相比,equal方法比较的是内容,而==比较的内存地址,java中JDK提供的常用类都equal方法进行了重写,比如:

枚举类Enum:

public final boolean equals(Object other) {
return this==other;
}

整型类Integer:

public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}

双精度浮点类Double:

 public boolean equals(Object obj) {
return (obj instanceof Double) && (doubleToLongBits(((Double)obj).value) == doubleToLongBits(value));
}

字符串类String:

public boolean equals(Object anObject) {
if (this == anObject) {
return 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;
}
}
return false;
}

注意:上面判断是不是同一个类是使用的是instanceof,这个词的含义是判断其左边对象是否为其右边类的实例或者子类的实例,而上面的几个类在定义时使用了final,也就是说不允许继承,因此可以使用该关键字,在自己编写equal方法时,需要使用.getClass() == this.getClass()判断类型是否一致;

  equal方法有以下五个性质:

  1. 自反性
  2. 对称性:不管谁调equal方法都不会影响结果
  3. 传递性
  4. 一致性:多次比较不会影响判断结果
  5. 任何非空对象与调用equal(null)均返回false

  java中需要选用合适的方法比较

  1. 对象域,使用equals方法 。
  2. 类型安全的枚举,使用equals或== 。
  3. 可能为null的对象域 : 使用 == 和 equals 。
  4. 数组域 : 使用 Arrays.equals 。
  5. 除float和double外的原始数据类型 : 使用 == 。
  6. float类型: 使用Float.floatToIntBits转换成int类型,然后使用==。
  7. double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。

  总的来说:类一般调用equal判断,当然首先需要对类进行判空,除了float和double之外的内置类型直接使用==进行内容比较,而float和double使用Float和Double的方法比较,也可以先生成Float或者Double对象调用equal方法,从前面Double的equal方法中可以看出,实质上还是调用了[float/double]To[Int/Long]Bit方法,建议直接使用该方法,避免不必要的开销。

参考:http://www.cnblogs.com/chenssy/p/3416195.html

java中equal方法总结的更多相关文章

  1. Java中equal和==区别及String创建过程

    Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...

  2. Java中的方法应用

    一.如何定义java中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 语法: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 public.protected.priv ...

  3. c#和java中的方法覆盖——virtual、override、new

    多态和覆盖 多态是面向对象编程中最为重要的概念之一,而覆盖又是体现多态最重要的方面.对于像c#和java这样的面向对象编程的语言来说,实现了在编译时只检查接口是否具备,而不需关心最终的实现,即最终的实 ...

  4. Java中的方法(形参及实参)return返回类型

    如何定义 Java 中的方法 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块. 一般情况下,定义一个方法的语法是: 其中: 1. 访问修饰符:方法允许被访问的权限范围, 可以是 pub ...

  5. java中的方法method

    java中的方法必须存在于类class里,不能独立存在.类是描述具有某种特征的事物,方法则是这类 事物具有的某种功能,通过调用方法可以实现某种特定的功能.方法名一般以小写的动词开头. 例: publi ...

  6. JAVA中native方法调用

    在Java中native是关键字.它一般在本地声明,异地用C和C++来实现.它的声明有几点要注意:1)native与访问控制符前后的关系不受限制.2)必须在返回类型之前.3)它一般为非抽象类方法.4) ...

  7. Java09-java语法基础(八)java中的方法

    Java09-java语法基础(八)java中的方法 一.方法(函数/过程):是一个程序块,可以完成某种功能 1.java中方法的定义格式 [访问控制修饰符]  返回值类型  方法名(参数列表){ 方 ...

  8. 使用java中replaceAll方法替换字符串中的反斜杠

    今天在项目中使用java中replaceAll方法将字符串中的反斜杠("\")替换成空字符串(""),结果出现如下的异常: java.util.regex.Pa ...

  9. java中,方法可以访问他的类对象的任何私有特性

    java中,方法可以访问他的类对象的任何私有特性 读一本书(Core Java for the Impatient)时,发现这个注意,以前的时候没有在意,今天仔细想想发现记忆不深刻.记录一下 下面代码 ...

随机推荐

  1. DOM常用外部插入方法与区别

    1.DOM外部插入after()与before() 节点与节点之前有各种关系,除了父子,祖辈关系,还可以是兄弟关系.之前我们在处理节点插入的时候,接触到了内部插入的几个方法,这节我们开始讲外部插入的处 ...

  2. 前段 format方法

    a.为字符串创建format方法,用于字符串格式化 String.prototype.format=function (arg) { //console.log(this,arg); //this,当 ...

  3. PhantomJS命令行选项

    支持命令行选项有: --help或-h列出所有可能的命令行选项.立即停止,不会运行一个脚本作为参数传递. --version或-v打印的版本PhantomJS.立即停止,不会运行一个脚本作为参数传递. ...

  4. #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。

    #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数). def get_num(num): i ...

  5. 从三个开源项目认识OpenFlow交换机 - OVS

    在SDN/NFV的网络革新技术浪潮的引领下,催生了诸多数据面开源方案的诞生.业界知名度较高的有OVS(Open vSwitch).FD.io (Fast Data I/O).ODP(Open Data ...

  6. WKWebView和WebView与JS的交互方式

    UIWebView与JS的交互方式 一,OC调用JS直接调用苹果提供的API - (nullable NSString *)stringByEvaluatingJavaScriptFromString ...

  7. python2.7-巡风源码阅读

    推荐个脚本示例网站:https://www.programcreek.com/python/example/404/thread.start_new_thread,里面可以搜索函数在代码中的写法,只有 ...

  8. 使用Nwjs开发桌面应用体验

    之前一直用.net开发桌面应用,最近由于公司需要转为nodejs,但也是一直用nodejs开发后台应用,网站,接口等.近期,需要开发一个客户端,想着既然nodejs号称全栈,就试一下开发桌面应用到底行 ...

  9. [测试题]line

    Description Input Output Sample Input 10 49743636 36679 707182 9310618 9814768 2315242 9916077 35233 ...

  10. POI SZP

    贪心: 初始所有点为白色,对于点i,若a[i]为白色则将其染成与i不同的颜色. 证明:若点i确定为白色,a[i]染白色也只能提供一个黑点,故a[i]染黑色不会差:若所有指向i的点均为黑色,则i只能是白 ...