存储在Arraylist或String数组中的输入?(新程序员)Java

Miz*_*izu 6 java arrays arraylist

在我看来ArrayList,几乎在每个场景中都会更容易使用,它非常通用.是否存在String[]用于存储输入数据的实例?如果出现这种情况,必然存在缺陷ArrayList,会是什么?

只有想到了我的头顶部的事情将是各种String类似的方法,substring()split()等.

编辑:StackOverflow的新手.如果这是重新发布,我道歉.并感谢格式化.

小智 6

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

但是,总的来说,数组在面向对象的语言中使用非常困难,并且几乎总是出于相同的原因:它们使得破坏封装非常容易。例如:

public class ExampleArray {
  private final String[] strings;

  public ExampleArray(String... strings) { this.strings = strings; }
  public String[] getStrings() { return strings; }
}
Run Code Online (Sandbox Code Playgroud)

看到任何问题吗?是的,您需要这样写getStrings()

// ...
public String[] getStrings() { return Arrays.copy(strings); }
// ...
Run Code Online (Sandbox Code Playgroud)

否则,某些调用者可以保留您班级的内部数据并开始对其进行修改。防止这种情况的唯一方法是每次呼叫者希望看到它时都将其复制。与正确的方法相反:

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

  // ...

  public List<String> getStrings() { return Collections.unmodifiableList(strings); }
}
Run Code Online (Sandbox Code Playgroud)

现在,您不复制数据,只是将其粘贴在不允许更改的API后面。如果使用Guava Immutable*类,那就更好了。