当前位置: 首页 > 知识库问答 >
问题:

数组的基元类型和包装器类型。asList[副本]

邢洋
2023-03-14

我有以下简单的测试用例

@Test
public void testArraysAsList() {
    Character[] chars1 = new Character[]{'a', 'b'};
    System.out.println(Arrays.asList(chars1).size());


    char[] chars2 = new char[]{'a', 'b'};
    System.out.println(Arrays.asList(chars2).size());

}

结果是: 2 1

我不明白Arrays.asList(chars2),为什么Arrays.asList(char[])使一个大小的列表,元素是char[]。

共有3个答案

阎佑运
2023-03-14

这是因为List只接受对象,不接受原语。所以当你传递一个对象数组时,它会获取这些对象并创建一个列表。但是当你传递一个原语数组时,它会获取数组本身(也就是一个对象)并创建列表。在第一种情况下,有两个对象,所以列表的长度是2。而在第二种情况下,只有一个对象(也就是数组本身),所以现在长度是1。

下面的代码将说明这一点

import java.util.Arrays;

public class Test {

    public static void main(String[] args) {
        Test test = new Test();
        test.testArraysAsList();
    }
    public void testArraysAsList() {
        Character[] chars1 = new Character[]{'a', 'b'};
        System.out.println(Arrays.asList(chars1).size());


        char[] chars2 = new char[]{'a', 'b'};
        System.out.println(Arrays.asList(chars2).size());

        Integer[] int1 = new Integer[]{1, 2};
        System.out.println(Arrays.asList(int1));

        int[][] int2 = new int[][]{{1,2},{1,2} };
        System.out.println(Arrays.asList(int2));


    }
}

现在看看在我的机器上运行上述代码所获得的输出。

2
1
[1, 2]
[[I@1540e19d, [I@677327b6]

因为int2数组是二维数组,所以它有两个数组。所以它有两个物体。在这种情况下,长度是2。您可以在输出中看到它,[[I@1540e19d[I@677327b6]是这次的两个数组对象。

希望这能说明问题。

樊博雅
2023-03-14

集合只能包含对象,不能包含基元类型。

java.util.Arrays.asList(T... a)这里T可以是一个非基元的对象。

在数组的情况下。作为列表(char[]),它将把char[]视为一个对象(T)。因此,您将在下面的打印中看到意外字符:

系统出来println(Arrays.asList(chars2));

输出:

[C@15db9742]

对于基元类型数组,大小将始终为1。

松翔
2023-03-14

正如@Andy解释的那样,泛型只适用于引用类型

    Character[] chars1 = new Character[]{'a', 'b'};
    List<Character> list1 = Arrays.asList(chars1);

    char[] chars2 = new char[]{'a', 'b'};
    List<char[]> list2 = Arrays.asList(chars2);

比较数组。asList(chars2)与此字符串示例(其中输入也是单个元素):

    String test = "test";
    List<String> asList = Arrays.asList(test);

返回一个大小为1的列表

 类似资料:
  • 我目前正在读一本名为Java的完整参考的书。第18章介绍了基元类型包装器。 正如本书第一部分所提到的,出于性能原因,Java使用基本类型,如int和char。这些数据类型不是对象层次结构的一部分。它们通过值传递给方法,不能直接通过引用传递。另外,有时两个方法无法引用同一个int实例,您需要为这些基元类型之一创建对象表示。例如,第19章讨论的集合类只处理对象;若要在这些类中的一个中存储基元类型,需要

  • 为了便于操作基本类型值,JavaScript 还提供了3个特殊的引用类型:Boolean、Number 和 String。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2 = s1.substring(2); 这个例子中的变量 s1 包含一个字符串,

  • 为了便于操作基本类型值,ECMAScript 还提供了3 个特殊的引用类型:Boolean、Number 和String。这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2

  • 基本包装类型 基本包装类型包括:Number、Boolean、String。 每当 读取(访问)基本类型值时,后台就会创建一个 对应的基本包装类型的对象。从而让我们能调用一些方法来操作这个数据。 注:后台自动创建的基本包装类型的生命周期只存在于 执行 这行代码 的瞬间。 var s1 = "hellow javaScript"; var s2 = s1.substring(2); 这个例子中,

  • 在下面的代码中,行显示为false。但是当我们再次比较另一个整数包装类时,它返回true。为什么包装器类的比较在第一种情况下是false,而在第二种情况下是true?

  • 问题内容: 这是我的问题和我的项目结构 我有一个要使用的类型 但是,当我尝试将其添加到导入中时,这些问题会出现: 虽然我在函数声明中使用了它 这是什么问题? 我试图用导入 问题答案: 您不能“ 从 包中导入”。您所能做的就是“导入 整个 程序包”。这意味着,如果您和该程序包在开始时就声明自己被称为foo ,则该程序包中的所有内容都必须由以下字符限定: 如果调用了包,则声明变量将使整个包变色:因此,