在Java中比较不同类型的数组大小

7

所以我想创建一个方法来验证两个数组的长度是否相同,如下:

validateSameSize(Object[] first, Object[] second) {
   if (first.length != second.length) throw new Exception();
}

问题是这种方法只适用于非基本类型的数组。如果我想比较一个char数组和另一个数组,这种方法就无法使用。是否有一种方法可以实现此功能而不会增加太多额外的开销?

我已经尝试过

<T,V> validateSameSize(T[] first, V[] second)

但是由于泛型也需要一个类,而且不能与原始类型一起使用,因此这种方法并不起作用。
validateSameSize(Array first, Array second)

也不起作用

2个回答

9
您可以使用 Array#getLength 方法:
public static boolean sameSize(Object arrayA, Object arrayB) {
    return Array.getLength(arrayA) == Array.getLength(arrayB);
}

它可以处理非基本数组以及基本数组:
System.out.println(sameSize(new int[0], new int[100])); // false
System.out.println(sameSize(new char[0], new int[0])); // true
System.out.println(sameSize(new Object[0], new Object[0])); // true
System.out.println(sameSize(new Object[0], new List[0])); // true

另外,不要忘记将非数组对象传递给 Array#getLength 将会导致 IllegalArgumentException
以下是示例代码:
Object notArray = 100;
System.out.println(Array.getLength(notArray));

生成:

Exception in thread "main" java.lang.IllegalArgumentException: Argument is not an array

如果您需要在调用Array#getLength之前快速失败,可以检查参数是否实际上是数组:

if (!object.getClass().isArray()) {
  // object is not array. Do something with it
}

非常感谢!所以只是为了澄清:原始数组不继承自Object[],但原始值确实继承自Object - Schottky
不,原始类型根本不参与继承。int不是对象,它只是一个数字。Java语言规范可能有一个名为“原始类型”的章节,这将是该主题的权威来源。 - Roland Illig
@Schottky 每个Java数组都是一个“对象”,无论其元素是否为“对象”。 - Boann

3

caco3的答案没问题。
请注意,如果Object参数不是数组,只有在运行时才会发现它们不是数组。
更安全的方法是为基本类型重载该方法:

void validateSameSize(Object[] first, Object[] second) throws Exception {
    if (first.length != second.length) throw new Exception();
}

void validateSameSize(int[] first, int[] second) throws Exception {
    if (first.length != second.length) throw new Exception();
}

因此,为了使您的代码更加健壮,需要编写更多的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接