2013-12-11 100 views
3

这是最好的选择来存储性能的基础上字符串列表。字符串VS字符串列表VS Stringbuilder列表

哪一个能够提供最佳性能。

谢谢。

+0

性能明智的阵列是好的。但是列表提供了阵列无法提供的高级功能。 –

+0

定义“性能”。空间,速度,可靠性?我们在谈论多少条弦乐? – user949300

+0

您可以检查此链接 http://stackoverflow.com/questions/13639712/what-efficient-java-collection-would-be-used-to-store-a-million-strings –

回答

5
ArrayList

是一个很好的通用List和通常会出执行ArrayLinkedList。这是在时间复杂度击穿(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[]进行比较可能不是人为的。

2

java 7之前的字符串文字列表将会消耗你的permgen区域,从而导致JVM崩溃。所以如果你有太多的字符串,最好去Stringbuilder。 Stringbuilder在内部使用char数组。但是,使用Stringbuilder来存储String列表,您可能必须使用特殊字符进行分隔,然后使用split()来取回列表。

更好的选择是去一个字符串数组。如前所述,即使Stringbuilder使用char数组。所以如果你确定你想存储String列表,这将是不错的选择。但是,如果这是唯一的目标,我会说为什么不使用ArratList ...你不必担心数组的大小。

+1

如何访问StringBuilder中的单个字符串?与Array和List相比,StringBuilder是不同的数据结构。 – camickr

+0

那么一种方法是将所有字符串附加特殊字符,并获得列表,你可以做一些像sbuilder.toString()。split(SpChar)。你将得到String数组。 –

+0

所以现在你必须解析数据才能访问它,然后你将数据存储在两个地方,一次在StringBuilder中,一次在Array中。从性能角度来看,我看起来效率不高。 – camickr

0
  • 字符串数组可用于指定数据大小时。 字符串数组 不可生长。
  • 收集类用于当您的数据是可增长。这意味着,如果您的数组大小将动态变化或运行时变化,那么您可以使用该数组。
  • StringBuilder不用于存储数据列表。它附加字符串数据,如字符串缓冲区。如果您 搜索字符串VS StringBuffer的字符串Vs的构建 之间的区别,你可以得到的想法
1

构建大型字符串时总是使用StringBuilder。虽然速度差异不明显,但这是最有效的。

我也听说过Java在字符串上使用加号运算符时内部使用了构建器。虽然我不确定,但这是不太可能的。

+1

Java编译器会用'new StringBuilder()。append(first).append(second)...'construct(或'StringBuffer')替换连接字符串。当你使用字符串连接反编译一个类时,你可以亲眼看到它。 – Cebence

+0

@Cebence嗯,那么它是如何决定是否使用缓冲区或构建器? – GGrec

+0

'StringBuffer?'意思也许就是那个,我不确定哪一个。它可能取决于编译器,但它总是使用相同的。 – Cebence

1

String是一个不可变的类,它不能被改变。 StringBuilder是可以附加到的可变类,替换或删除字符并最终转换为String

请注意,如果您使用Java 5或更新版本,则应使用StringBuilder而不是StringBuffer。从API文档:

作为释放JDK 5的,这类已补充了由单个线程,StringBuilder设计用于的等效类。 StringBuilder类通常应优先于此类使用,因为它支持所有相同的操作,但速度更快,因为它不执行同步。

对于More