java 初始化对象数组的最方便方法

fykwrbwg  于 2023-06-20  发布在  Java
关注(0)|答案(6)|浏览(136)

还有比这样做更方便的方法来初始化对象数组吗?

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

fcy6dtqo1#

使用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;
}
uwopmtnx

uwopmtnx2#

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

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

然而,这实际上并没有给您带来任何好处,因为无论何时您用不同的String替换其中一个数组项,您都必须有效地创建一个新的String对象。这意味着创建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.
}

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

avwztpqn

avwztpqn3#

这不是更快,但它的代码更少:

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

9avjhtql4#

所以,你告诉我你想创建一个不同对象的数组。然后必须有一个默认的构造函数或传入的工厂。我将展示第一种情况的代码-当您可以使用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

qcbq4gxm

qcbq4gxm5#

你可以声明像

String[] array;
...
array = new String[]{object1, object2};
szqfcxe2

szqfcxe26#

Java 8 Streams支持用一行构造和初始化SomeClass数组。

SomeClass[] array = IntStream.range(0, 100).mapToObj(i -> new SomeClass()).toArray(SomeClass[]::new);

相关问题