当前位置: 首页 > 知识库问答 >
问题:

一串子字符串vs字符串[]。分裂

戎兴言
2023-03-14

我有一个逗号分层的字符串,当调用String.split (",")时,它返回大约60的数组大小。在特定的用例中,我只需要从数组中返回第二个值的值。例如,"Q, BAC,233, sdf, sdf,"我想要的只是第一个','之后和第二个','之前的字符串的值。我对性能的问题是,我最好自己使用子字符串或使用拆分方法解析它,然后在数组中获取第二个值?任何输入都将受到赞赏。这种方法每秒会被调用数百次,因此了解有关性能和内存分配的最佳方法非常重要。

-邓肯


共有3个答案

毛景曜
2023-03-14

你当然最好手工做,原因有两个:

  • 。split()将字符串作为参数,但该字符串被解释为模式,对于您的用例来说,模式代价高昂
  • 正如你所说,你只需要第二个元素:抓取第二个元素的算法非常简单,可以手工完成
谭凯
2023-03-14

当然,为什么要遍历整个字符串,只需使用substring()indexOf()

罗允晨
2023-03-14

由于String. Split返回一个字符串[],使用60路Split将导致每行大约60个不必要的分配。Split遍历整个字符串,并创建60个新对象加上数组对象本身。在这61个对象中,您只保留一个,并让垃圾收集器处理剩余的60个。

如果在紧密循环中调用它,子字符串肯定会更有效:它会穿过字符串的部分,直到第二个逗号,然后创建一个新的对象并保留。

String s = "quick,brown,fox,jumps,over,the,lazy,dog";
int from = s.indexOf(',');
int to = s.indexOf(',', from+1);
String brown = s.substring(from+1, to);

上面打印的是brown

当您多次运行这个函数时,subString会在短时间内获胜:1,000,000次拆分迭代需要3.36s,而1,000,000次subString迭代只需要0.05s。而且字符串中只有8个组件!60个组件的差异会更大。

 类似资料:
  • 问题内容: 有没有一种简单的方法来测试Python字符串“ xxxxABCDyyyy”,以查看其中是否包含“ ABCD”? 问题答案: if “ABCD” in “xxxxABCDyyyy”: # whatever

  • GETRANGE key start end 返回key 中字符串值的子字符串,字符串的截取范围由start 和end 两个偏移量决定(包括start 和end 在内)。可以使用负值,字符串右面下标是从-1开始的。 注意返回值处理: 1: start>=length, 则返回空字符串 2: stop>=length,则截取至字符结尾 3: 如果start 所处位置在stop右边, 返回空字符串

  • 对性能是否有影响? 不同Java版本的行为是否有差异?

  • 例如,我们有一个字符串:asd/asd/asd/1#s_ 我需要匹配以下部分:/asd/1#s_或asd/1#s_如何使用普通正则表达式? 我试过像这样的消极前瞻,但它不起作用 它匹配这个“前缀/asd/1#s_”,我需要匹配“/asd/1#s_”中的这个“/asd/1#”,我需要匹配“/asd/1#s_”,而没有所有前面的 /asd/'s 匹配应该与普通正则表达式没有任何编程语言的任何帮助函数h

  • 问题内容: 在Java 6之前,我们在上有一个固定时间的子字符串。在Java 7中,为什么要使用复制数组并降级到线性时间复杂度? 问题答案: 在Oracle错误#4513622中讨论了为什么要做出决定:(str)保留字段的子字符串会阻止对象的GC: 如示例中那样调用String.substring时,未分配用于存储的新字符数组。它使用原始String的字符数组。因此,支持原始字符串的字符数组在子字

  • 问题内容: 我曾经在JavaScript中这样做: Swift没有此功能,如何做类似的事情? 问题答案: 编辑/更新: Xcode 11•Swift 5.1或更高版本 用法: 不区分大小写的样本 正则表达式样本