在Java中将列表转换为数组

col*_*ore 469 java arrays android list arraylist

我怎么能转换ListArrayJava中?

检查以下代码:

ArrayList<Tienda> tiendas;
List<Tienda> tiendasList; 
tiendas = new ArrayList<Tienda>();

Resources res = this.getBaseContext().getResources();
XMLParser saxparser =  new XMLParser(marca,res);

tiendasList = saxparser.parse(marca,res);
tiendas = tiendasList.toArray();

this.adaptador = new adaptadorMarca(this, R.layout.filamarca, tiendas);
setListAdapter(this.adaptador);  
Run Code Online (Sandbox Code Playgroud)

我需要tiendas使用值填充数组tiendasList.

Eng*_*uad 1028

或者:

Foo[] array = list.toArray(new Foo[0]);
Run Code Online (Sandbox Code Playgroud)

要么:

Foo[] array = new Foo[list.size()];
list.toArray(array); // fill the array
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于引用类型的数组.对于基本类型的数组,使用传统方式:

List<Integer> list = ...;
int[] array = new int[list.size()];
for(int i = 0; i < list.size(); i++) array[i] = list.get(i);
Run Code Online (Sandbox Code Playgroud)

  • 为什么它不只是`Foo [] array = list.toArray();`超出我的范围. (34认同)
  • @Diederik这是Java的Generics集合与其非泛型集合共享类的不幸副作用.`Collection`的`.toArray()`在Java 1.0或1.1中定义为返回`Object []`,现在改变它已经太迟了.Kinda让我希望Java为.NET这样的泛型使用不同的集合来避免这种疯狂. (21认同)
  • @MarcusJuniusBrutus不,你错了.如果你使用`new Foo [0]`那么你就是在创建一个额外无用的数组.检查源代码以进行验证. (20认同)
  • 对于第一种形式,我更喜欢`list.toArray(new Foo [0])`,因为它清楚地表明参数只是为类型信息传递而且大小是无关紧要的. (14认同)
  • @Diederik因为`list.toArray()`返回`Object []`而不是`Foo []`. (14认同)
  • @Powerlord但是可以引入类似toTypedArray()的东西. (3认同)
  • @powerlord 这是令人讨厌的意想不到的事情。我原以为它会做简单而明显的事情。现在可怜的开发人员记住了很多 java 类型的细节,只是为了从她的 ArrayList 中获取一个数组。:( (2认同)
  • @ Eng.Fouad你是对的,但是在这里和其他答案的评论中停止说'检查源代码':关于`toArray(T [] a)`的数组参数如何工作的信息就在Java中任何理智的人首先检查的API文档:-) (2认同)

Vit*_*nko 156

Java 8中的替代方案:

String[] strings = list.stream().toArray(String[]::new);
Run Code Online (Sandbox Code Playgroud)

  • +1 Stream API很酷. (24认同)
  • 在C#中:list.ToArray(); //没有进一步的评论:/ (4认同)
  • 但是在这种特殊情况下使用Stream是否更好? (2认同)
  • 比 Java 8 之前的解决方案更详细。伤心。 (2认同)

小智 41

我认为这是最简单的方法:

Foo[] array = list.toArray(new Foo[0]);
Run Code Online (Sandbox Code Playgroud)

  • ^如果这是预期的样式,则无需设置数组的大小.toArray的文档(T [] a):`如果列表适合指定的数组,则返回其中.否则,将为新数组分配指定数组的运行时类型和此列表的大小 (6认同)
  • 也许设置正确的数组大小,你很明显知道它 (4认同)
  • @SuZhang`如果列表适合指定的数组`.确保列表不适合传递的数组`new Foo [0]`(除非列表本身为空),并且将创建一个新数组来保存列表项.你只是传递数组的类型(而对象本身是无用的). (3认同)
  • 当传入一个数组太大的数组时,toArray()方法必须使用reflexion构造一个正确大小的新数组.这比传递至少是集合本身大小的数组的性能要差得多.来源:Intellij的检查:http://git.jetbrains.org/?p = idea/community.git; a = blob; f = plugins/InspectGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/performance/ToArrayCallWithZeroLengthArrayArgumentInspectionBase.java; H = 51bee0da98c0f5d529b89f6a7e07352b346ef743; HB = f06ad8a2e893083c9fac3aa4c1cf3ba49b7a84f4 (2认同)

pan*_*dre 6

我在没有 Java 8 的情况下想到的最好的事情是:

public static <T> T[] toArray(List<T> list, Class<T> objectClass) {
    if (list == null) {
        return null;
    }

    T[] listAsArray = (T[]) Array.newInstance(objectClass, list.size());
    list.toArray(listAsArray);
    return listAsArray;
}
Run Code Online (Sandbox Code Playgroud)

如果有人有更好的方法,请分享:)