[英]what is more performant equal or instanceof?
执行者使用哪种方法?
等于:
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;
}
这两种方法有什么区别,每种情况都有哪些缺点?
第二个要好得多,因为第一个可以通过重构破坏,并且类型系统不会让您知道。
您还应该知道,第一种方法不适用于Pear
子类(如果有)。 更糟糕的是,如果在不同的命名空间中有多个称为"Pear"
类,可能会感到困惑。
至于性能,您将需要进行基准测试,但我希望第二个也会更快,因为instanceof
是JVM上的单个操作码( https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings )。
我想将另外两个摘要添加到您的列表中。 因此,四个选项如下所示。
请注意,这四个选项在功能上都不同!
#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;
}
性能方面(至少在OpenJDK HotSpot JVM中):
#4
是最快的 #2
和#3
接近, #2
可能在JIT编译之后最快 #1
可能是真正的性能瓶颈,尤其是在多线程环境中 由于全局关键节和字符串操作, Class.getSimpleName()
可能变得不合理而缓慢。 我已经看到它曾经是一个真正的性能瓶颈。 该方法用于格式化日志消息。
从风格上讲,我会根据功能需求推荐#2
和#4
。
再强调一次, 这四个选项在功能上都不同!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.