【问题标题】:java : Understanding Arrays.asList(T...array) method for primitive typesjava:了解基本类型的 Arrays.asList(T...array) 方法
【发布时间】:2018-05-16 15:04:28
【问题描述】:

我写了以下代码,看到输出很惊讶:

    Integer a = 211;
    int b = 211;

    int[] array = {210,211,212};

    System.out.println(Arrays.asList(array).contains(a));
    System.out.println(Arrays.asList(array).contains(b));

输出:

false
false

我找到了this 问题和一些与之相关的其他问题,并了解到asList 方法不是自动装箱的东西。我在 eclipse javadoc 预览中检查了返回的类型:

我不太明白这个返回类型。 int[] 是一个对象而不是原始对象,所以它很好。我确定我没有收到List<Integer>(我所期望的),但我不确定如何使用被退回的东西。我的问题是:

    1。当我期待 Integer 列表并获得 int[] 列表时,我究竟如何期望列表方法起作用?
    2。对于字符串,返回类型是字符串列表,而不是字符串 [] 列表。有哪些实现差异?
    3。如果事情如此不确定,这种方法对原语有什么好处?

【问题讨论】:

    标签: java arrays list autoboxing


    【解决方案1】:

    您得到的不是 Lit 或 List(不可能),而是整数数组的 List。

    所以你的列表不包含 211,它包含一个数组,然后包含 211。

    数组不是“展开”到列表中,而是“按原样”添加到新创建的列表中。

    所以:

    System.out.println(Arrays.asList(array).contains(array)); // Will return true
    System.out.println(Arrays.asList(a).contains(a)); // Will return true
    

    【讨论】:

      【解决方案2】:

      这是因为Arrays.asList()variadic 泛型函数。改变这个,

      int[] array = {210,211,212};
      

      Integer[] array = { 210, 211, 212 };
      

      输出将是truetrue

      【讨论】:

        【解决方案3】:

        Arrays.asList 将对象作为参数。由于 int[] 是一个对象,因此您将获得 List。 如果你想要一个整数列表,你应该做 Arrays.asList(211,212,213)。

        【讨论】:

          【解决方案4】:

          这里显然有3个问题,让我们一一解决:

          1. 当我期待一个整数列表并获得一个 int[] 列表时,我究竟如何期望列表方法起作用?

          好吧,List 方法将完全按预期工作,List<T>T 类型的列表。这里Tint[],所以List<int[]> 将包含数组作为每个元素:

          [{1, 2}, {3, 4}, {1, 6}]
          

          所以get(i) 将返回ith 元素。在Arrays.asList 的情况下,List 包含一个元素,即int[] 所以:

          int[] array = {210,211,212};
          List<int[]> list = Arrays.asList(array);
          

          [{210, 211, 212}]
          

          所以

          list.get(0)[0] == 210
          

          如果是字符串,则返回类型是字符串列表,而不是字符串列表 []。有什么样的实现差异?

          StringObject不是原始类型。区别由此而来。

          1. 如果事情如此不确定,这种方法对原语有什么好处?

          事情不是不确定。此方法导致定义可预测行为。它对原语不是很有用。这是结合 Java 的类型系统和泛型的(又一个)副作用。

          注意在 Java 8 中,int[]List&lt;Integer&gt; 的转换非常简单:

          List<Integer> list = Arrays.stream(array).
                  boxed().
                  collect(toList());
          

          【讨论】:

          • 感谢新的 java 8 示例
          【解决方案5】:
          int[] array = {210,211,212};
          
          Arrays.asList(array)
          

          等于

          List<int[]> asList = Arrays.asList(array); 
          

          改变

          int[] array = {210,211,212};Integer[] array = {210,211,212}; 它将起作用。 它等于List&lt;Integer&gt; asList = Arrays.asList(array);

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-20
            • 2014-09-26
            • 1970-01-01
            • 2016-09-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多