在使用以下各项之间是否存在偏好或行为差异:

if(obj.getClass().isArray()) {}

if(obj instanceof Object[]) {}

?

推荐答案

在大多数情况下,应该使用instanceof运算符来测试对象是否为array.

通常,在向下转换到编译时已知的特定类型之前,需要测试对象的类型.例如,您可能编写了一些可以使用Integer[]int[]的代码.你想用instanceof来保护你的演员阵容:

if (obj instanceof Integer[]) {
    Integer[] array = (Integer[]) obj;
    /* Use the boxed array */
} else if (obj instanceof int[]) {
    int[] array = (int[]) obj;
    /* Use the primitive array */
} else ...

在JVM级别,instanceof运算符转换为特定的"instanceof"字节代码,这在大多数JVM实现中都得到了优化.

在更罕见的情况下,您可能会使用反射来遍历未知类型的对象图.在这种情况下,isArray()方法可能会有所帮助,因为您在编译时不知道组件类型;例如,您可能正在实现某种序列化机制,并且能够将数组的每个组件传递给同一个序列化方法,而不考虑类型.

有两种特殊情况:空引用和对基元数组的引用.

空引用将导致instanceof返回false,而isArray抛出NullPointerException.

如果将instanceof应用于基元数组,则除非右侧操作数上的组件类型与组件类型完全匹配,否则instanceof将产生false.相反,对于任何组件类型,isArray()将返回true.

Java相关问答推荐

在现有Json文件中添加新记录

try Dockerize Maven应用程序,但发布版本21不支持"

如何计算内循环的时间复杂度?

如何使用Java API在Oracle ODI中运行模拟?

缩小画布比例后更改滚动窗格的内部大小

流迭代列表<;对象>;上的NoSuchElementException

对Java中的通配符参数的混淆

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

Spring data JPA/Hibernate根据id获取一个列值

如何在Java中从XML中获取特定的 node ,然后将其删除?

生成桥方法以解决具有相同擦除的冲突方法

Java ArrayList的整数和数组的泛型

在Eclipse中数组的可空性

Android Java:已设置但未读取SharedPreferences

Cordova Android Gradle内部版本组件不兼容

如何根据配置动态创建N个bean

在一行中检索字符分隔字符串的第n个值

如何在Java中的重写方法参数中强制(Enum)接口实现?

如何通过用户ID向用户发送私信

org.springframework.web.HttpRequestMethodNotSupportedException:请求方法';帖子';不支持