java instanceof和Class之间的区别是什么。是否可从(…)中识别?
以下哪一项更好
a instanceof B
或
B.class.isAssignableFrom(a.getClass())
我所知道的唯一区别是,当'a'为null时,第一个返回false,而第二个抛出异常。除此之外,他们总是给出相同的结果吗
你可以在下面搜索框中键入要查询的问题!
以下哪一项更好
a instanceof B
或
B.class.isAssignableFrom(a.getClass())
我所知道的唯一区别是,当'a'为null时,第一个返回false,而第二个抛出异常。除此之外,他们总是给出相同的结果吗
# 1 楼答案
就表现而言:
TL;DR
使用性能相似的isInstance或instanceofisAssignableFrom稍慢
按性能排序:
基于JAVA 8 Windows x64上2000次迭代的基准测试,其中有20次预热迭代
理论上
使用类似bytecode viewer的软代码,我们可以将每个运算符转换为字节码
在以下方面:
爪哇:
字节码:
爪哇:
字节码:
爪哇:
字节码:
通过测量每个运算符使用的字节码指令数,我们可以预期instanceof和isInstance的速度要比isAssignableFrom快。然而,实际性能不是由字节码决定的,而是由机器代码(取决于平台)决定的。让我们为每个运营商做一个微观基准测试
基准
信贷:根据@aleksandr dubinsky的建议,并感谢@yura提供的基本代码,这里有一个JMH基准测试(见此tuning guide):
给出以下结果(分数一个时间单位内的若干操作,因此分数越高越好):
警告
instanceof
可能比isInstance
更容易优化,例如李>举一个例子,以下面的循环为例:
多亏了JIT,代码在某个时刻得到了优化,我们得到:
注意
最初,这篇文章使用原始JAVA中的for循环来做自己的基准测试,这会给出不可靠的结果,因为一些优化(如准时制)可以消除循环。因此,它主要是测量JIT编译器优化循环所需的时间:有关更多详细信息,请参见Performance test independent of the number of iterations
相关问题
# 2 楼答案
instanceof
只能与引用类型一起使用,不能与基元类型一起使用isAssignableFrom()
可用于任何类对象:见http://java.sun.com/javase/6/docs/api/java/lang/Class.html#isAssignableFrom(java.lang.Class)
# 3 楼答案
还有另一个区别:
不管X是什么,X的空实例都是
false
空。getClass()。isAssignableFrom(X)将抛出NullPointerException
# 4 楼答案
除了上面提到的基本区别之外,instanceof操作符和类中的isAssignableFrom方法之间还有一个核心细微的区别
把
instanceof
读作“这(左部分)是这个或这个(右部分)的任何子类的实例吗?”把x.getClass().isAssignableFrom(Y.class)
读作“我能写X x = new Y()
”。换句话说,instanceof运算符检查左对象是否与右类相同或是右类的子类,而isAssignableFrom
检查是否可以将参数类(from)的对象分配给调用该方法的类的引用请注意,这两个都考虑实际实例而不是引用类型。
考虑3个类A、B和C的例子,其中C扩展了B,B扩展了.< /p>
# 5 楼答案
与
a instanceof B
更直接的等价物是当
a
也是null
时,该方法有效(返回false)# 6 楼答案
使用
instanceof
时,需要在编译时知道B
的类。当使用isAssignableFrom()
时,它可以是动态的,并且在运行时会发生变化