- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个非常长字符串str = "abcdef..."
。
我想使用 str.replaceFirst("^xyz","")
替换其中可能的 "xyz"
前缀。
上述表达式的预期运行时间是多少?
replaceFirst
会在第一个字符之后立即返回,还是会迭代整个字符串?
P.S.:我需要一个知道 Java 字节码解释器在编译(或者我应该说“解释”) 的
类。replaceFirst
方法时如何在幕后工作的人的答案。 String
无论为了返回结果而创建的中间字符串如何,请考虑我的问题。在任何情况下都会发生这种情况(无论我使用什么 String
方法来完成所需的转换)。因此,我删除了涉及复杂性的部分,因为无论如何它都是 O(n)
...
总结一下问题:
我可以假设正则表达式匹配本身的运行时间不依赖于str
的长度吗?
最佳答案
replaceFirst
在我的 jdk 版本上使用 StringBuffer 创建一个新字符串。因此,假设正则表达式和替换字符串的长度都很小,由于字符串复制,其时间复杂度为 O(n),其中 n
是初始字符串的长度:
public String replaceFirst(String replacement) {
if (replacement == null)
throw new NullPointerException("replacement");
reset();
if (!find())
return text.toString();
StringBuffer sb = new StringBuffer();
appendReplacement(sb, replacement);
appendTail(sb);
return sb.toString();
}
注释:
replaceFirst
转到return text.toString()
,它返回字符串本身:如果没有匹配,则它是O(1) 运算。startsWith
+ substring
曾经是 O(1)(当 substring
是字符串的 View 时,即直到 Java 7u5),但是现在也是 O(n)(因为 Java 7y6 substring
通过复制底层 char 数组创建一个新字符串)。更新
我快速测试了操作的性能,通过使用 ^
anchor 和不使用 anchor 的正则表达式来匹配空字符串和长字符串,以确认上述情况。结果(每次调用以纳秒为单位):
p1s1 (empty string, "^x") 47.561 nsec/op
p1s2 (long string, "^x") 50.753 nsec/op
p2s1 (empty string, "x") 47.526 nsec/op
p2s2 (long string, "x") 131.015 nsec/op
因此您可以看到 "^x"
正则表达式会删除第一个字符处的分析,因为时间(几乎)与空字符串或长字符串相同。
代码,使用 jmh 进行 benhcmarking:
private String s1 = "";
private String s2 = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" +
"x";
private static final Pattern p1 = Pattern.compile("^x");
private static final Pattern p2 = Pattern.compile("x");
@GenerateMicroBenchmark
public boolean p1s1() { return p1.matcher(s1).find(); }
@GenerateMicroBenchmark
public boolean p1s2() { return p1.matcher(s2).find(); }
@GenerateMicroBenchmark
public boolean p2s1() { return p2.matcher(s1).find(); }
@GenerateMicroBenchmark
public boolean p2s2() { return p2.matcher(s2).find(); }
关于java - Java 中 String.replaceFirst ("^...") 的预期运行时间是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21546961/
假设我有一个字符串 String link = "www.thisisalink.com/tick1=@tick1@&tick2=@tick2@&tick3=@tick3@&tick4=@tick4@
我试图转义仅在 内的 HTML我遇到的标签(不要问我这里面有没有逻辑) 我确实写了这个简短的程序,它工作正常,但我想跳到下一场比赛,而不实际添加 id="ProcessedTag"所以它不仅仅取代第
想象一个场景,您正在将 DNA 的碱基更改为其补码(A -> T,T -> A等) 如果我想在一行中执行此操作,只需一个替换命令(无论是 replaceFirst、replaceAll 等),我将如何
以下例程在 WIN XP x32、JAVA 版本 7 Update 9 和 WIN7 x64、JAVA 版本 6 Update 32 上的行为有所不同。 private int getNrOfMatc
假设我想用“zzz”替换字符串中第一次出现的“yyy”。 String.replaceFirst 似乎是一个完美的解决方案 str = str.repaceFirst("yyy", "zzz"); 但
嗨,我正在尝试编写代码来读取包含一首诗的文件。然后它将每行中的第一个“您”更改为“我们”。我一直在尝试使用replaceFirst()、replace()、replaceAll();然而,没有一个人能
scala > val a = (x:Int)=>x+1 res0: Int => Int = scala > val b = a.getClass b: Class[_ Int] = c
我正在尝试替换字符串的一部分。该部分包含一些特殊字符: #L(inches)=24# 我知道replaceFirst是正则表达式驱动的,但我似乎无法创建与字符串中的这部分匹配的正则表达式,有什么想法吗
我使用httpclient来抓取html。在我的代码中,我发现 html = html.replaceFirst("[cC][hH][aA][rR][sS][eE][tT]\\s*?=\\s*?([g
这个问题已经有答案了: Not able to replace all for dollar sign (4 个回答) 已关闭 3 年前。 我有一个字符串,我尝试用它替换第一次出现的 %s。 例如:
我有一个“余额”字符串,前面包含一个美元符号。我想修改这个标志,这样我就可以将刺痛转换为双倍,但我的代码不起作用。 这是我尝试过的: String balance = "$5.30"; balance
有什么方法可以让 .replaceFirst() 开始仅替换特定字符串之后的 a 吗?例如我知道正则表达式不能很好地处理 html,并且我的 html 文本由 1 个 h2 标题和一个段落组成。现在,
我有一个包含 xyaahhfhajfahj{adhadh}fsfhgs{sfsf} 的字符串。 现在我想用空格替换{string}。 我想用空替换大括号和其中的字符串。 我想为它使用 replaceF
我在使用 replaceFirst 时得到一个奇怪的 ArrayOutOfBoundsException: "this is an example string".replaceFirst("(^th
使用java,我尝试将某个字符串的出现替换为其他字符串。它在大多数情况下都有效。但有时特定的字符串在给定的内容中不会被替换。 当我使用indexOf方法搜索给定内容中的某个字符串时,我可以正确获取该字
在 Java 中,String 类提供了 3 种字符串替换方法,分别是 replace()、replaceFirst() 和 replaceAll(),本文将详细介绍它们的使用方法。 repla
好吧,我有一个在使用 string.replace() 时替换文本的方法,它可以工作,但是当我切换到 relpaceFirst() 时,如下所示,它不再工作,我在这里做错或遗漏了什么? private
这个问题已经有答案了: Why does replaceAll fail with "illegal group reference"? (8 个回答) 已关闭 5 年前。 我尝试在执行restTem
因此,我需要返回修改后的字符串,其中它用另一个 token 替换 token 的第一个实例,同时跳过注释。这是我正在讨论的示例: This whole quote is one big String
当我这样做的时候 String s = "2r2"; System.out.println(s.replaceFirst("2r2","4")); 它有效,打印 4,但是当我这样做时 String s
我是一名优秀的程序员,十分优秀!