那么,您将如何进行转换
String csv = "11,00,33,66,44,33,22,00,11";
以最快最优化的方式添加到哈希集。
这是用于用户标识的列表。
我运行了通过测试程序提供的所有答案,对于较大的CSV字符串,每种方法被调用500,000次。该测试连续进行了5次(以防程序启动减慢了初始方法的速度),以毫秒(ms)为单位,我得到了以下信息:
Method One Liner-> 6597
Method Split&Iterate-> 6090
Method Tokenizer-> 4306
------------------------------------------------
Method One Liner-> 6321
Method Split&Iterate-> 6012
Method Tokenizer-> 4227
------------------------------------------------
Method One Liner-> 6375
Method Split&Iterate-> 5986
Method Tokenizer-> 4340
------------------------------------------------
Method One Liner-> 6283
Method Split&Iterate-> 5974
Method Tokenizer-> 4302
------------------------------------------------
Method One Liner-> 6343
Method Split&Iterate-> 5920
Method Tokenizer-> 4227
------------------------------------------------
static void method0_oneLiner() {
for (int j = 0; j < TEST_TIMES; j++) {
Set<String> hashSet = new HashSet<String>(Arrays.asList(csv
.split(",")));
}
}
// ———————————————————————————————–
static void method1_splitAndIterate() {
for (int j = 0; j < TEST_TIMES; j++) {
String[] values = csv.split(",");
HashSet<String> hSet = new HashSet<String>(values.length);
for (int i = 0; i < values.length; i++)
hSet.add(values[i]);
}
}
static void method2_tokenizer() {
for (int j = 0; j < TEST_TIMES; j++) {
HashSet<String> hSet = new HashSet<String>();
StringTokenizer st = new StringTokenizer(csv, ",");
while (st.hasMoreTokens())
hSet.add(st.nextToken());
}
}
其他6个答案很棒,因为它们是最直接的转换方式。
但是,由于String.split()
涉及到正则表达式,并且Arrays.asList
正在执行冗余转换,因此您可能希望以此方式进行操作,这可能会稍微提高性能。
如果您对将要拥有多少个物品有一个大致的了解,请进行编辑,请使用HashSet
构造函数参数以避免不必要的调整大小/散列:
HashSet<String> myHashSet = new HashSet(500000); // Or a more realistic size
StringTokenizer st = new StringTokenizer(csv, ",");
while(st.hasMoreTokens())
myHashSet.add(st.nextToken());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句