8

在我看来ArrayList,几乎在每种情况下都更容易使用,它非常通用。是否存在String[]用于存储输入数据的实例?如果有这种情况,一定有缺点ArrayList,那会是什么?

我脑海中唯一想到的就是各种String方法,例如,substring()split()等。

编辑:StackOverflow 的新手也是如此。如果这是重新发布,我深表歉意。并感谢您的格式化。

4

6 回答 6

6

简短的回答是:不要使用数组,总是使用数组列表。唯一的例外是,如果您绝对需要控制使用的内存量,或者您有一些只能String[]支持的特定性能限制。

不过,总的来说,数组在面向对象语言中使用起来很糟糕,而且几乎总是出于相同的原因:它们很容易破坏封装。例如:

public class ExampleArray {
  private final String[] strings;

  public ExampleArray(String... strings) { this.strings = strings; }
  public String[] getStrings() { return strings; }
}

看看有什么问题吗?是的,你需要这样写getStrings()

// ...
public String[] getStrings() { return Arrays.copy(strings); }
// ...

否则,某些调用者可以获取您班级的内部数据并开始修改它。防止这种情况的唯一方法是每次调用者想要看到它时复制它。与正确的方法相反:

public class ExampleList {
  private final List<String> strings;

  // ...

  public List<String> getStrings() { return Collections.unmodifiableList(strings); }
}

现在你不是在复制数据,你只是把它放在一个不允许更改的 API 后面。如果你使用 GuavaImmutable*类,那就更好了。

于 2012-12-15T05:48:51.790 回答
4

当然,在某些情况下您想使用它String[]。例如,如果您提前知道列表的长度,并且列表可能很大。

使用的主要缺点ArrayList是随着列表的增长,必须重新分配数组,这不是自由操作。您可以通过使用接受initialCapacity.

于 2012-12-14T07:30:31.620 回答
2
  1. 您可以在编译时初始化 Java 数组,例如:

    字符串数据[] = { "a", "b", "c" };

  2. 在旧版本的 Java 中,也有类型安全的情况。ArrayList 元素必须转换为原始类型,而 Java 数组则类型安全。

  3. Java 数组是语言的一部分,您将无法更改它们。ArrayList 是 Java API 的一部分。如果您需要(但我推荐),您可以替换您自己的库来实现 ArrayList 作业。

于 2012-12-14T07:32:26.070 回答
2

ArrayList 是大小可动态增长的数组,而字符串数组或任何类型的数组的大小都是静态的。

显然,这种动态增长特性会产生一些成本,它会重新分配具有新大小的数组并将元素复制到其中。

于 2012-12-14T07:30:50.653 回答
1

查看stackoverflow中其他人提出的这些问题:

Java 中的数组或列表。哪个更快?

Java 性能 - ArrayLists 与 Arrays 的大量快速读取

于 2012-12-14T07:31:45.800 回答
1

当数组用于保存某些值时,我想到的唯一情况是当有一种方法采用可变数量的参数时,例如:

void doSth(int i, String... strings){
 if(strings.length>0){
  //some stuff
 }

否则,当需要使用数组时,我几乎不会故意制造一种情况。

于 2012-12-14T07:43:13.100 回答