在我看来,ArrayList
几乎在每个场景中都更容易使用,它非常通用。是否存在String[]
用于存储输入数据的实例?如果出现这种情况,ArrayList
必定存在缺陷,会是什么?
只有我脑海中浮现的事情才会出现各种String
方法,例如substring()
和split()
等。
编辑:StackOverflow的新手。如果这是重新发布,我道歉。并感谢格式化。
答案 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)
您可以在编译时初始化Java数组,例如:
字符串数据[] = {“a”,“b”,“c”};
在Java的旧版本中,还存在类型安全的情况。 ArrayList元素必须转换为原始类型,而Java数组类型为safe。
Java数组是该语言的一部分,您将无法更改它们。 ArrayList是Java API的一部分。如果您需要(我不推荐它),您可以替换自己的库来实现ArrayList作业。
答案 4 :(得分:1)
查看stackoverflow中其他人提出的这些问题:
Array or List in Java. Which is faster?
Java Performance - ArrayLists versus Arrays for lots of fast reads
答案 5 :(得分:1)
当数组用于保存某些值时,我想到的唯一一种情况是,当有一个方法采用可变数量的参数时,如:
void doSth(int i, String... strings){
if(strings.length>0){
//some stuff
}
否则,当需要使用数组时,我几乎不会故意创建情境。