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

sub*_*nid 4 java

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

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

Dee*_*ala 8

使用 Arrays.fill()

String[] stringArray = new String[100];
Arrays.fill(stringArray, "");
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)


Nat*_*ord 2

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

String[] arr = new String[100];
Arrays.fill(arr, new String());//Array utility
Run Code Online (Sandbox Code Playgroud)

String然而,这实际上并没有给你带来任何好处,因为每当你用不同的字符串替换这些数组项之一时,你都必须有效地创建一个新对象。这意味着创建 a 的行为new String()是多余的,因此效率较低。

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

List<String> arr = new ArrayList<String>();
Run Code Online (Sandbox Code Playgroud)

这解决了同样的问题,并为您带来了面向对象的好处。如果可以的话,通常建议您远离原始数组:基于对象的数组更有用,可以使代码更简洁,程序通常更高效。

如果您使用可变类型,并且预填充的目的是确保从数组中检索对象时存在该对象,则处理此问题的最佳方法是在接收端实际使用异常,原因有两个:首先,您可以通过在实际需要之前不分配内存来节省内存(以及随之而来的所有节省),第二个是,几乎无法阻止数组将元素设置为null,因此您必须检查反正:

try {
  SomeObject myObj = arr.get(idx);
  myObj.doSomethingFun();//will fail if this is null!
} catch (NullPointerException e) {
  //do something intelligent like return a fail case.
}
Run Code Online (Sandbox Code Playgroud)

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