根据性能选择存储字符串列表的最佳选择。
哪一个提供最佳性能。
感谢。
答案 0 :(得分:8)
ArrayList
是一个很好的通用目标List
,通常会超过Array
或LinkedList
。以下是时间复杂度方面的细分(V
是类型,i
是索引):
Type | add(V) | remove(V) | get(i) |
-------------------------------------------
Array | O(n) | O(n) | O(1) |
ArrayList | O(1) | O(n) | O(1) |
LinkedList | O(1) | O(1) | O(n) |
一般情况下,您可以使用此规则:
数组:如果您知道元素的确切数量并且不需要添加或删除元素,请使用。
列表:如果您不知道确切的元素数量并需要添加或删除元素,请使用。
StringBuilder
完全不同。 StringBuilder
是一个可变字符串。您可以将其视为List<Character>
。从这个意义上讲,它可能不是你需要的,所以把它与List<String>
或String[]
进行比较可能不是有益的。
答案 1 :(得分:2)
java 7之前的字符串文字列表将消耗你的permgen区域,这可能导致JVM崩溃。所以,如果你有更多的字符串,那么最好去Stringbuilder。 Stringbuilder内部使用char数组。但是,使用Stringbuilder存储String列表时,您可能必须使用特殊字符进行分隔,然后使用split()来检索列表。
更好的替代方案是使用String数组。如前所述,即使Stringbuilder使用char数组。因此,如果您确定要存储String列表,那么这将是一个不错的选择。但如果这是唯一的目标,我会说为什么不使用ArratList ...你不必担心数组的大小。
答案 2 :(得分:1)
构造大字符串时始终使用StringBuilder
。虽然速度差异不明显,但这是最有效的。
我还听说过,当你在字符串上使用plus运算符时,Java会在内部使用构建器。虽然我不确定,但这种可能性很小。
答案 3 :(得分:1)
String
是一个不可变类,无法更改。 StringBuilder
是一个可变类,可以追加,替换或删除字符,最终转换为String
。
请注意,如果您使用的是Java 5或更高版本,则应使用StringBuilder
代替StringBuffer
。从API文档:
自JDK 5发布以来,该类已经补充了一个等效类,专为单个线程
StringBuilder
使用而设计。通常应优先使用StringBuilder
类,因为它支持所有相同的操作,但它更快,因为它不执行同步。
答案 4 :(得分:0)