性能更好的equal或instanceof是什么?

时间:2019-05-22 11:35:50

标签: java performance

执行者使用哪种方法?

等于:

public boolean hasSellByDate(Object item) {
  if ("Pear".equals(item.getClass().getSimpleName())) {
    return true;
  }
  return false;
}

instanceof:

public boolean hasSellByDate(Object item) {
   if (item instanceof food.Pear) {
     return true;
   }
   return false;
 }

这两种方法有什么区别,每种情况都有哪些缺点?

2 个答案:

答案 0 :(得分:3)

第二个要好得多,因为第一个可以通过重构破坏,并且类型系统不会让您知道。

您还应该知道,第一个方法不适用于Pear的子类。更糟糕的是,如果在不同的命名空间中有多个名为"Pear"的类,可能会感到困惑。

关于性能,您将需要进行基准测试,但是我希望第二个也会更快,因为instanceof是JVM(https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings)上的单个操作码。

答案 1 :(得分:1)

我想将另外两个片段添加到您的列表中。因此,四个选项如下所示。

请注意,这四个选项在功能上都是不同的!

#1

public boolean hasSellByDate(Object item) {
  if ("Pear".equals(item.getClass().getSimpleName())) {
    return true;
  }
  return false;
}

#2

public boolean hasSellByDate(Object item) {
  if (item instanceof food.Pear) {
    return true;
  }
  return false;
}

#3

public boolean hasSellByDate(Object item) {
  if ("food.Pear".equals(item.getClass().getName())) {
    return true;
  }
  return false;
}   

#4

public boolean hasSellByDate(Object item) {
  if (item.class == food.Pear) {
    return true;
  }
  return false;
}

Performancewise(至少在OpenJDK HotSpot JVM中):

  • #4是最快的
  • #2#3接近,#2可能在JIT编译之后最快。
  • #1可能是真正的性能瓶颈,尤其是在多线程环境中

Class.getSimpleName()可能由于全局关键部分和字符串操作而变得缓慢。我已经看到它曾经是一个真正的性能瓶颈。该方法用于格式化日志消息。

从风格上讲,我会根据功能需求推荐#2#4

再强调一次,这四个选项在功能上都不同!