数组列表 vs ArrayList ?

问题描述 投票:5回答:4

我无法弄清楚为什么不允许使用ArrayList <int>但允许使用ArrayList <int []>。

我的印象是收藏中不允许原始数据类型,为什么这是合法的?

java generics collections reference primitive-types
4个回答
5
投票

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

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

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


6
投票

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

原始int不是参考类型。

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

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


2
投票

int是原始的。

int []是对象。

具有ANY_OBJECT的ArrayList有效。

带有ANY_PRIMITIVE的ArrayList无效。

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


0
投票

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

在Java中,每个数组类型都有一个类,因此有一个int []类,类似于float,double等。数组类型的直接超类是Object。每个数组类型都实现了Cloneable和java.io.Serializable接口。可以在数组上调用Object类的所有方法。这可以从下面的代码中检查:

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); 
 } 
} 

输出:True True

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

你可以在这里查看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 []具有直接超类Object,可以。

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

© www.soinside.com 2019 - 2024. All rights reserved.