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

时间:2012-12-14 07:28:22

标签: java arrays arraylist

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

只有我脑海中浮现的事情才会出现各种String方法,例如substring()split()等。

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

6 个答案:

答案 0 :(得分:4)

简短的回答是:不要使用数组,总是使用数组列表。唯一的例外是,如果您绝对需要控制使用的内存量,或者您有一些只有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后面。如果你使用Guava Immutable*类,那就更好了。

答案 1 :(得分:3)

当然,您可能希望使用String[]。例如,如果您事先知道列表的长度,那么列表可能很大。

使用ArrayList的主要缺点是随着列表的增长,必须重新分配数组,这不是自由操作。您可以通过使用constructor that accepts an initialCapacity将其预分配为您期望的大小(或更大)来缓解这种情况。

答案 2 :(得分:2)

ArrayList的大小是动态可扩展数组,其中字符串数组或任何类型的数组的大小都是静态的。

显然,这种动态增长功能会导致一些成本,它会使用新的大小和复制元素重新分配数组。

答案 3 :(得分:2)

  1. 您可以在编译时初始化Java数组,例如:

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

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

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

答案 4 :(得分:1)

答案 5 :(得分:1)

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

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

否则,当需要使用数组时,我几乎不会故意创建情境。