首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >初始化对象数组的最便捷方法

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

Stack Overflow用户
提问于 2013-04-20 01:53:53
回答 5查看 998关注 0票数 5

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

代码语言:javascript
复制
SomeClass[] someArray = new SomeClass[100];
//...
for (int i = 0; i < someArray.length; i++) { 
  someArray[i] = new SomeClass();
}
// ...
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-20 01:59:12

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

代码语言:javascript
复制
String[] arr = new String[100];
Arrays.fill(arr, new String());//Array utility

但是,这实际上并没有给您带来任何好处,因为无论何时用不同的字符串替换这些数组项中的一个,您都必须有效地创建一个新的String对象。这意味着创建new String()的操作是多余的,因此效率较低。

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

代码语言:javascript
复制
List<String> arr = new ArrayList<String>();

这解决了同样的问题,并为您带来了面向对象的好处。通常建议您尽可能远离原始数组:基于对象的数组更易用,从而使代码更整洁,程序效率也更高。

如果您使用的是可变类型,预填充点是为了确保对象在从数组中检索时存在,最好的处理方法是在接收端实际使用异常,原因有两个:第一个原因是在实际需要内存之前不分配内存(以及随之而来的所有节省);第二个原因是几乎不会阻止数组将元素设置为null,因此无论如何都必须进行检查:

代码语言:javascript
复制
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.
}

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

票数 2
EN

Stack Overflow用户

发布于 2013-04-20 01:56:02

使用Arrays.fill()

代码语言:javascript
复制
String[] stringArray = new String[100];
Arrays.fill(stringArray, "");

它不会更快,因为它像您一样遍历数组,但它更方便。

Arrays.fill()代码

代码语言:javascript
复制
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;
}
票数 8
EN

Stack Overflow用户

发布于 2013-04-20 01:56:28

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

代码语言:javascript
复制
String[] stringArray = new String[100];
Arrays.fill(stringArray, "");
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16110690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档