我有一个逗号分层的字符串,当调用String.split (",")
时,它返回大约60的数组大小。在特定的用例中,我只需要从数组中返回第二个值的值。例如,"Q, BAC,233, sdf, sdf,"我想要的只是第一个
','
之后和第二个','
之前的字符串的值。我对性能的问题是,我最好自己使用子字符串或使用拆分方法解析它,然后在数组中获取第二个值?任何输入都将受到赞赏。这种方法每秒会被调用数百次,因此了解有关性能和内存分配的最佳方法非常重要。
-邓肯
你当然最好手工做,原因有两个:
。split()
将字符串作为参数,但该字符串被解释为模式
,对于您的用例来说,模式
代价高昂
当然,为什么要遍历整个字符串,只需使用substring()
和indexOf()
由于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或更高版本 用法: 不区分大小写的样本 正则表达式样本