在Java中构建字符串是否有“最快的方法”?
我通常用以下方式在Java中创建一个String:
String foo =“123456”;
但是,我的讲师坚持要求我使用format
方法形成一个String,如下所示:
String foo = String.format(“%s”,123456);
要快得多。
此外,他说使用StringBuilder类更快。
StringBuilder sb = new StringBuilder(); String foo = sb.append(String.format(“%s”,123456))。toString();
创建String的最快方法是哪一个, 如果有的话 ?
它们不可能100%准确,因为我可能不会完全记住它们。
如果只有一个字符串,那么:
String foo = "123456";
最快。 您会注意到String.format
行中声明了"%s%"
,因此我没有看到讲师如何认为更快。 另外,你还有一个方法调用。
但是,如果您正在构建一个字符串,例如在for循环中,那么您将需要使用StringBuilder。 如果你只是使用+=
那么你每次调用+=
行时都会构建一个全新的字符串。 StringBuilder的速度要快得多,因为它每次调用append
都会保存一个缓冲区并附加到缓冲区。
稍微偏离主题,但我希望整个“必须不使用加连接到Java中的字符串”神话会消失。 虽然在Java的早期版本中可能确实存在StringBuffer更快且“+是邪恶的”,但在现代JVM中处理大量优化的情况肯定不是这样。
例如,哪个更快?
String s = "abc" + "def";
要么
StringBuffer buf = new StringBuffer(); buf.append("abc"); buf.append("def"); String s = buf.toString();
答案是前者。 JVM认识到这是一个字符串常量,实际上将“abcdef”放在字符串池中,而“优化的字符串缓冲”版本将导致构建一个额外的StringBuffer对象。
另一个JVM优化是
String s = onestring + " concat " + anotherstring;
JVM将在哪里找出最好的连接方式。 在JDK 5中,这意味着StringBuilder将在内部使用,并且比使用字符串缓冲区更快。
但正如其他答案所说,你问题中的“123456”常数肯定是最快的方式,你的讲师应该回到学生身上:-)
是的,我已经非常伤心地通过查看Java字节码来validation这一点……
整个讨论没有实际意义。 请阅读Jeff撰写的这篇文章,即创建Stack Overflow的人。
微优化剧场的悲剧悲剧
请将您的导师转介到这篇文章,并要求他停止用无用的信息破坏他/她的学生的大脑。 算法优化是代码生存或死亡的地方,而不是用于构造字符串的方法。 在任何情况下,StringBuilder和String格式化程序都必须使用REAL MEMORY执行ACTUAL CODE,如果你只是构造一个字符串,它会在编译期间被保留并准备好在你需要它时使用,实质上它有0运行 – 时间成本,而其他选项具有实际成本,因为代码实际上需要执行。
String foo = "some string literal";
肯定是制作String的最快方法。 它嵌入在.class文件中,是一个简单的内存查找方式。
当你没有任何真正的格式时,使用String.format
只是看起来很丑,可能会导致初级开发人员哭。
如果要修改String,那么StringBuilder
是最好的,因为Strings
是不可变的 。
在您的第二个示例中,使用:
String foo = String.format("%s", 123456);
什么都买不到; 123456已经是一个常数值,为什么不分配foo =“123456”? 对于常量字符串,没有更好的方法。
如果要在运行时将多个部分创建一个字符串,请使用StringBuffer或StringBuilder(前者是线程安全的)。
如果你的字符串在编译时是已知的,那么最好使用文字: String foo = "123456";
。
如果您的字符串在编译时是未知的并且由较小字符串的聚合组成,则StringBuilder
通常是要走的路(但要注意线程安全!)。
使用String foo = String.format("%s", 123456);
可以减少你的.class的大小,并使类加载它更快一点,但这将是非常积极的(极端)内存调整那里^^。
正如已经指出的,如果你只是构建一个没有连接的单个字符串,只需使用String。
为了将多个位连接成一个大字符串,StringBuffer比StringBuilder慢,但StringBuffer是同步的。 如果您不需要同步,请使用StringBuilder。
您是否100%确定教师不是在谈论以下内容:
String foo = "" + 123456;
我看到我的学生“一直”做那种事情(每个学期都会做一些事)。 他们这样做的原因是有些书向他们展示了如何这样做。 懒惰的书作者摇头和拳头!
你给出的第一个例子是最快和最简单的。 用那个。
您在这些示例中添加的每段代码都会使其显着变慢并且更难以阅读。
我建议示例2比示例1慢至少10-100倍,示例3比示例2慢约2倍。
您的处理器是否为此断言提供了任何理由?
顺便说一句:你的第一个例子根本没有构造一个String(这就是它最快的原因),它只是给你一个坐在String常量池中的String。