有没有比这样做更方便的方法来初始化对象数组?
SomeClass[] someArray = new SomeClass[100];
//...
for (int i = 0; i < someArray.length; i++) {
someArray[i] = new SomeClass();
}
// ...
有没有比这样做更方便的方法来初始化对象数组?
SomeClass[] someArray = new SomeClass[100];
//...
for (int i = 0; i < someArray.length; i++) {
someArray[i] = new SomeClass();
}
// ...
采用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;
}
这不是更快,但它的代码更少:
String[] stringArray = new String[100];
Arrays.fill(stringArray, "");
由于String
Java 中的不变性,您的问题有点奇怪。主要推力表明您正在寻找这个:
String[] arr = new String[100];
Arrays.fill(arr, new String());//Array utility
但是,这实际上并没有为您带来任何好处,因为String
每当您将其中一个数组项替换为不同的字符串时,您都必须有效地创建一个新对象。这意味着创建 a 的行为new String()
是多余的,因此效率较低。
这就引出了一个问题:你为什么要这样做?是为了确保返回一个有效的对象吗?或者数组中的对象实际上是一个String
?如果是后者,请使用泛型:
List<String> arr = new ArrayList<String>();
这解决了同样的问题,并为您带来了面向对象的好处。如果可以的话,通常建议您远离原始数组:基于对象的数组更有用,导致代码更简洁,程序通常更高效。
如果您使用的是可变类型,并且预填充的目的是确保从数组中检索对象时存在,则处理此问题的最佳方法是在接收端实际使用异常,原因有两个:首先是您通过在实际需要之前不分配内存来节省内存(以及随之而来的所有随之而来的节省),其次是几乎没有阻止数组将元素设置为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.
}
请注意,虽然异常在捕获实际错误时会产生开销,但在此之前它们没有开销。出于这个原因,您不想将它们用于控制流,但您确实想使用它们(比您可能做的更多)来捕获没有意义的边缘情况。
因此,您告诉您要创建不同对象的数组。然后必须有一个默认构造函数或您传入的工厂。我将展示第一种情况的代码 - 当您可以调用空构造函数时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
你可以像这样声明
String[] array;
...
array = new String[]{object1, object2};