数组的 Arrays.asList()

     2023-02-25     141

关键词:

【中文标题】数组的 Arrays.asList()【英文标题】:Arrays.asList() of an array 【发布时间】:2010-11-17 22:31:39 【问题描述】:

这个转换有什么问题?

public int getTheNumber(int[] factors) 
    ArrayList<Integer> f = new ArrayList(Arrays.asList(factors));  
    Collections.sort(f);
    return f.get(0)*f.get(f.size()-1);

我是在阅读Create ArrayList from array 中的解决方案后做出的。 getTheNumber(...) 中的第二行(排序)导致以下异常:

线程“main”java.lang.ClassCastException 中的异常:[我无法转换为 java.lang.Comparable]

这里有什么问题?我确实意识到可以使用Arrays.sort() 进行排序,我只是对这个感到好奇。

【问题讨论】:

哇,感谢您的即时答复!干杯,所有:) 简短回答:因为 int[] 不可比较 【参考方案1】:

让我们考虑以下简化示例:

public class Example 
    public static void main(String[] args) 
        int[] factors = 1, 2, 3;
        ArrayList<Integer> f = new ArrayList(Arrays.asList(factors));
        System.out.println(f);
    

在 println 行,这会打印出类似 "[[I@190d11]" 的内容,这意味着您实际上已经构建了一个包含 int arrays 的 ArrayList。

您的 IDE 和编译器应该警告该代码中未检查的分配。您应该始终使用new ArrayList&lt;Integer&gt;()new ArrayList&lt;&gt;() 而不是new ArrayList()。如果你使用过它,会因为试图将List&lt;int[]&gt; 传递给构造函数而出现编译错误。

int[]Integer[] 没有自动装箱,而且无论如何自动装箱只是编译器中的语法糖,所以在这种情况下你需要手动进行数组复制:

public static int getTheNumber(int[] factors) 
    List<Integer> f = new ArrayList<Integer>();
    for (int factor : factors) 
        f.add(factor); // after autoboxing the same as: f.add(Integer.valueOf(factor));
    
    Collections.sort(f);
    return f.get(0) * f.get(f.size() - 1);

【讨论】:

您的图片链接似乎已损坏。如果您仍然有原始图像,请将其重新上传到 stack.imgur,或者只是编辑您的答案以使其在没有图像的情况下工作。谢谢。 感谢您的通知。当前版本的 IntelliJ IDEA 给出的警告与我记得的损坏图像不同(IIRC 曾经有一个 Arrays.asList 特定警告),所以我编辑了答案以在没有图像的情况下工作。【参考方案2】:

您正在尝试将 int[] 转换为 Integer[],这是不可能的。

在从数组中获取列表之前,您可以使用 commons-lang 的 ArrayUtils 将整数转换为整数:

public int getTheNumber(int[] factors) 
    Integer[] integers = ArrayUtils.toObject(factors);
    ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(integers));
    Collections.sort(f);
    return f.get(0)*f.get(f.size()-1);
    

【讨论】:

【参考方案3】:

这个异常有两个原因:

1

Arrays.asList(factors) 返回一个List&lt;int[]&gt;,其中factors 是一个int 数组

2

您忘记将类型参数添加到:

ArrayList<Integer> f = new ArrayList(Arrays.asList(factors));

与:

ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(factors));  

导致编译时错误:

找到:java.util.List 必需:java.util.List

【讨论】:

构造函数ArrayList(List)是否存在? @dfa @MaheshVarma 是的,为什么不呢?但是您还需要在 ArrayList 中指定该类型:ArrayList&lt;int[]&gt; f = new ArrayList&lt;int[]&gt;(Arrays.asList(factors));。永远记住int[] 只是Object 的子类,所以它被允许作为泛型类型。【参考方案4】:

使用 java.utils.Arrays:

public int getTheNumber(int[] factors) 
    int[] f = (int[])factors.clone();
    Arrays.sort(f);
    return f[0]*f[(f.length-1];

或者,如果您想高效地避免所有对象分配,只需实际完成工作:

public static int getTheNumber(int[] array) 
    if (array.length == 0)
        throw new IllegalArgumentException();
    int min = array[0];
    int max = array[0];
    for (int i = 1; i< array.length;++i) 
        int v = array[i];
        if (v < min) 
            min = v;
         else if (v > max) 
            max = v;
        
    
    return min * max;

【讨论】:

+1,因为这个解决方案确实比不方便的 Collections 更适合这个问题。【参考方案5】:

我认为您已经找到了一个自动装箱不起作用的示例。因为 Arrays.asList(T... a) 有一个 varargs 参数,所以编译器显然会考虑 int[] 并返回一个包含单个元素的 List&lt;int[]&gt;

你应该把方法改成这样:

public int getTheNumber(Integer[] factors) 
    ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(factors));  
    Collections.sort(f);
    return f.get(0) * f.get(f.size() - 1);

为了兼容性可能会添加这个

public int getTheNumber(int[] factors) 
    Integer[] factorsInteger = new Integer[factors.length];
    for(int ii=0; ii<factors.length; ++ii) 
        factorsInteger[ii] = factors[ii];
    

    return getTheNumber(factorsInteger);

【讨论】:

【参考方案6】:

Arrays.asList(factors) 返回 List&lt;int[]&gt;,而不是 List&lt;Integer&gt;。由于您使用的是new ArrayList 而不是new ArrayList&lt;Integer&gt;,因此不会出现编译错误,而是创建一个包含int[]ArrayList&lt;Object&gt;,然后您将该arraylist 隐式转换为ArrayList&lt;Integer&gt;。当然,当您第一次尝试使用其中一个“整数”时,您会遇到异常。

【讨论】:

【参考方案7】:

这适用于 Java 5 到 7:

public int getTheNumber(Integer... factors) 
    ArrayList<Integer> f = new ArrayList<Integer>(Arrays.asList(factors));
    Collections.sort(f);
    return f.get(0)*f.get(f.size()-1);

在 Java 4 中没有可变参数... :-)

【讨论】:

【参考方案8】:

这是来自 Java API "排序

public static void sort(List list) 根据其元素的自然顺序,将指定列表按升序排序。列表中的所有元素都必须实现 Comparable 接口。此外,列表中的所有元素必须相互可比较(即,e1.compareTo(e2) 不得为列表中的任何元素 e1 和 e2 抛出 ClassCastException)。"

这与实现 Comparable 接口有关

【讨论】:

【参考方案9】:

据我了解,集合类中的排序函数只能用于对实现了可比较接口的集合进行排序。

您正在为它提供一个整数数组。 您可能应该将其包装在已知的 Wrapper 类之一中,例如 Integer。 整数实现可比较。

我已经很长时间没有从事一些严肃的 Java 工作了,但是阅读一些有关排序功能的内容会有所帮助。

【讨论】:

arrays.aslist的用法

使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportOperationException异常说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配... 查看详情

arrays.aslist()介绍(代码片段)

...  List是一种很有用的数据结构,如果需要将一个数组转换为List以便进行更丰富的操作的话,可以这么实现:String[]myArray="Apple","Banana","Orange";List<String>myList=Arrays.asList(myArray);  或者List<String>myList=Arrays.asList... 查看详情

arrays类--arrays.aslist()方法使用

...—java.util.ArrayspublicclassArraysextendsObject此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。除非特别注明,否则如果指定数组引用为null,则此类中的方法都会抛出NullPoi... 查看详情

arrays

Arrays:用于操作数组对象的工具类,里面都是静态方法。asList方法:将数组转换成list集合。String[]arr={"abc","kk","qq"};List<String>list=Arrays.asList(arr);//将arr数组转成list集合。将数组转换成集合,有什么好处呢?用aslist方法,将数... 查看详情

list中的arrays.aslist()

...来写写相关的注意事项.1.Arrays.asList()方法对基本数据类型数组是会出现bug的.如果要用到像int,double这类的一定要转化成包装类来使用.因为asList的源码是泛型化的参数,而基本数据类型是不支持泛型化的,但数组是支持的.2.Arrays.asList... 查看详情

从arrays.aslist到collection.toarray()(代码片段)

...平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。String[]myArray="Apple","Banana","Orange";List<String>myList=Arrays.asList(myArray);//上面两个语句等价于下面一条语句List<String>myLis... 查看详情

数组集合转换

数组转集合Arrays.asList()asList()返回的对象是一个Arrays内部类,没有实现集合的修改类Arrays.asList()体现了适配器模式,只是转换的接口,其后台数据依然是数组集合转数组toArray(T[]array)参数是类型和大小与集合相同的数组,无参时... 查看详情

arrays.aslist()详解(代码片段)

【1.要点】 该方法是将数组转化成List集合的方法。 List<String>list=Arrays.asList("a","b","c");注意:(1)该方法适用于对象型数据的数组(String、Integer...)(2)该方法 查看详情

arrays.aslist()返回一个特殊的“arraylist”

一个Arrays.asList()基本的用法:String[]str=newString[]{"1","2","3"};ArrayListal=newArrayList(Arrays.asList(str));//将数组元素添加到集合的一种快捷方式有时候这样使用就有可能出现问题:String[]str=newString[]{"1","2","3"};Listaslist=Arrays.asLis 查看详情

arrays.aslist使用误区(代码片段)

       Arrays.asList使用的jar包是importjava.util.Arrays;  Arrays.asList是使用该jar中的ArrayList方法 1、 基本类型数组Int[]intArr=1,2,3;ListlistArr=Arrays.asList(int 查看详情

千万不要这样使用arrays.aslist!

...(ID:Push-Code)使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合。而一开始asList的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比较更方便的打印... 查看详情

java之arrays.aslist陷阱

Java.Util.Arrays可以将数组转换为List,具体的定义如下:@SafeVarargspublicstatic<T>List<T>asList(T...a){returnnewArrayList<>(a);}可以看到实际上是将这个数组转换成为了ArrayList<>,看似没有问题,但是当我们使用add和remove的时候... 查看详情

浅谈arrays.aslist()方法的使用

  首先,该方法是将数组转化为list。有以下几点需要注意:  (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean)  (2)该方法将数组与列表链接起来,当更新其中之一时,另一个自动更新  (3)不... 查看详情

数组7:解析《阿里巴巴开发手册》中arrays.aslist的问题(代码片段)

​在《阿里巴巴Java开发手册》泰山版中,对于Arrays和ArraysList的使用规则有三条说明,而且都是红色标记的强制。可见这是非常重要的问题,我们现在用两期来分析一下。使用Arrays.asList的强制要求,原文是这么说... 查看详情

arrays.aslist()(代码片段)

Arrays.asList()将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象。@SafeVarargs@SuppressWarnings("varargs")publicstatic<T>List<T>asList(T...a)returnnewArrayList<>(a);这个ArrayList类并非java.util.A 查看详情

关于不可变列表(由 Arrays.asList() 创建)

...-1608:04:28【问题描述】:当我们使用java.util.Arrays.asList()从数组创建列表时,列表是不可变的。我只是想知道当List(或Set或Map)的基本目的是具有动态大小并能够随意添加、删除元素时,我们为什么要创建一个不 查看详情

arrays.aslist中所遇到的坑

...从代码定位来看,原来是使用了Arrays.asList()方法时把一个数组转化成List列表时,对得到的List列表进行add()和remove()操作,所以导致了这个问题。 对于这个问题,现在来总结下,当然会总结Arrays下面的一些坑。源代码分析首 查看详情

arrays.aslist()详解(代码片段)

【1.要点】 该方法是将数组转化成List集合的方法。 List<String>list=Arrays.asList("a","b","c");注意:(1)该方法适用于对象型数据的数组(String、Integer...)(2)该方法不建议使用于... 查看详情