最方便的方法来初始化一个对象数组

时间:2013-04-19 17:53:53

标签: java

初始化对象数组是否有比这更方便的方法?

SomeClass[] someArray = new SomeClass[100];
//...
for (int i = 0; i < someArray.length; i++) { 
  someArray[i] = new SomeClass();
}
// ...

5 个答案:

答案 0 :(得分:8)

使用Arrays.fill()

String[] stringArray = new String[100];
Arrays.fill(stringArray, "");

它不是更快,因为它像你一样迭代数组,但它更方便。

Arrays.fill()代码

public static void fill(Object[] a, int fromIndex, int toIndex, Object val) {
    rangeCheck(a.length, fromIndex, toIndex);
    for (int i=fromIndex; i<toIndex; i++)
        a[i] = val;
}

答案 1 :(得分:2)

这不是更快,但代码较少:

String[] stringArray = new String[100];
Arrays.fill(stringArray, "");

答案 2 :(得分:2)

由于Java中String的不变性,你的问题有点奇怪。主要推力表明你正在寻找这个:

String[] arr = new String[100];
Arrays.fill(arr, new String());//Array utility

但是,这实际上并不能解决任何问题,因为只要用不同的String替换其中一个数组项,就必须有效地创建一个新的String对象。这意味着创建new String()的行为是多余的,因此效率较低。

这引出了一个问题:你为什么要这样做?是否确保返回有效对象?或者数组中的对象实际上是String?如果是后者,请使用泛型:

List<String> arr = new ArrayList<String>();

这解决了同样的问题,让您可以从面向对象中获益。如果可以的话,通常建议您远离原始数组:基于对象的数组更加实用,从而使代码更清晰,程序效率更高。

如果您使用的是可变类型,并且预填充点是为了确保从数组中检索对象时存在,那么处理此问题的最佳方法是在接收端实际使用异常,对于两个原因:第一个是你通过在实际需要之前不分配内存来节省内存(以及随之而来的所有伴随节省),第二个是没有停止数组将元素设置为{{1无论如何你必须检查:

null

请注意,虽然异常会在捕获实际错误时带来开销,但在此之前它们没有开销。因此,您不希望将它们用于控制流,但您确实希望使用它们(比您可能做的更多)来捕获无意义的边缘情况。

答案 3 :(得分:2)

所以,你告诉过你要创建不同对象的数组。然后必须有一个默认构造函数或传入的工厂。我将显示第一种情况的代码 - 当你可以用Class<...>.newInstance()调用空构造函数时:

import java.lang.reflect.Array;
// ... in a class:
@SuppressWarnings("unchecked")
public static <T> T[] initializedArray(int size, Class<T> classHint) throws java.lang.Exception {
   T[] result = (T[]) Array.newInstance(classHint, size);
   for (int i = 0; i < size; ++i) {
      result[i] = classHint.newInstance();
   }
   return result;
}

此处使用示例:http://ideone.com/pbTFq9

答案 4 :(得分:1)

你可以声明像

String[] array;
...
array = new String[]{object1, object2};
相关问题