在我看来ArrayList
,几乎在每种情况下都更容易使用,它非常通用。是否存在String[]
用于存储输入数据的实例?如果有这种情况,一定有缺点ArrayList
,那会是什么?
我脑海中唯一想到的就是各种String
方法,例如,substring()
和split()
等。
编辑:StackOverflow 的新手也是如此。如果这是重新发布,我深表歉意。并感谢您的格式化。
简短的回答是:不要使用数组,总是使用数组列表。唯一的例外是,如果您绝对需要控制使用的内存量,或者您有一些只能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*
类,那就更好了。
当然,在某些情况下您想使用它String[]
。例如,如果您提前知道列表的长度,并且列表可能很大。
使用的主要缺点ArrayList
是随着列表的增长,必须重新分配数组,这不是自由操作。您可以通过使用接受initialCapacity
.
您可以在编译时初始化 Java 数组,例如:
字符串数据[] = { "a", "b", "c" };
在旧版本的 Java 中,也有类型安全的情况。ArrayList 元素必须转换为原始类型,而 Java 数组则类型安全。
Java 数组是语言的一部分,您将无法更改它们。ArrayList 是 Java API 的一部分。如果您需要(但我不推荐),您可以替换您自己的库来实现 ArrayList 作业。
ArrayList 是大小可动态增长的数组,而字符串数组或任何类型的数组的大小都是静态的。
显然,这种动态增长特性会产生一些成本,它会重新分配具有新大小的数组并将元素复制到其中。
当数组用于保存某些值时,我想到的唯一情况是当有一种方法采用可变数量的参数时,例如:
void doSth(int i, String... strings){
if(strings.length>0){
//some stuff
}
否则,当需要使用数组时,我几乎不会故意制造一种情况。