ArrayList<int> vs ArrayList<int[]>?

ArrayList<int> vs ArrayList<int[]>?

我无法弄清楚为什么 ArrayList<int> not allowed但是 ArrayList<int[]> 是 allowed

我的印象是集合中不允许使用原始数据类型,那么为什么这是合法的?

Java 中的 array 是 object。在 Java 中,我们可以使用 new 运算符创建数组,我们知道每个 object 都是使用 new 运算符创建的。因此我们可以说 array 也是一个 object.

Collection 仅适用于任何 Objectint 是原始数据类型,int[] 是 Object。

这就是不允许 ArrayList<int> 但允许 ArrayList<int[]> 的原因。

泛型仅适用于引用类型(任何 Object)。

原始 int 不是引用类型。

int[] 是,因为 any 数组也是一个对象。

处理多个 int 值的正确方法是使用 just int[](不将它们放入列表中),或者使用 List<Integer> .选择哪一个实际上取决于您的具体用例。

int 是原始的。

int[] 是对象。

带有 ANY_OBJECT 的 ArrayList 有效。

带有 ANY_PRIMITIVE 的 ArrayList 无效。

并且因为 int[] 是一个对象,所以 ArrayList 是可能的,但对于 int 原语 ArrayList 是无效的。

Java中的数组是一个对象。在 Java 中,我们可以使用 new 运算符创建数组,我们知道每个对象都是使用 new 运算符创建的。

在Java中,每个数组类型都有一个class,所以int[]有一个class,float、double等也是如此。 数组类型的直接superclass是Object。每个数组类型都实现接口 Cloneablejava.io.Serializable。 class 对象的所有方法都可以在数组上调用。这可以从下面的代码中检查:

public class Test { 
public static void main(String[] args) 
{  
    System.out.println(args instanceof Object); 
    int[] arr = new int[2]; 
    System.out.println(arr instanceof Object); 
 } 
} 

输出:真 真

ArrayList 初始化中使用的菱形运算符指定了泛型。泛型类型是泛型 class 或通过类型参数化的接口。

您可以在此处查看 ArrayList 的源代码:http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/tip/src/share/classes/java/util/ArrayList.java

可以看到参数化构造函数中elementData的类型是Object。原语是一种不是对象的数据类型:

private transient Object[] elementData;

因此 int 是 java 中的原始数据类型,它不能用作通用类型,其中 int[] , 那个直接superclass 对象, 就可以.

您可以在此处阅读更多相关信息:https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html