在这篇文章中,我想考虑、分析、讲述和展示类中的append方法和for
是的,毫无疑问没有深入研究这个问题的人会说:“为什么我要通过创建一个完全不同的类的新对象来替换 += 运算符,然后也调用该方法
StringBuilder
操作 符之间的区别。这里的问题与其说是应用领域,不如说是代码优化。 +=
String
toString()
?我们是什么样的最优性? “在说什么?选择是显而易见的,你在说什么?” 他就完全错了。问题之一是String
它并不原始。String
- 与 Java 中的任何其他对象一样的对象class
,如您所知,在 Java 中不存在运算符重载(例如在 C++ 中),运算符仅为基元定义,对于任何类,我们都不能重写任何运算符。这就是为什么运算符“ +
”和“ +
=”是Java库的一种“拐杖”,而拐杖总是会带来损失。实际上,让我们停止拉猫尾巴并继续进行测量。这是一个简单的程序,用于测量将一行与循环变量“粘合”100,000 次所需的时间。
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
String s = "Hello";
for(int i = 0; i < 100000; ++i)
{
s+=i;
}
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
在我的电脑上,控制台显示 6815ms。也就是说,我的电脑花了将近 7 秒的时间才把这条线拼接在一起。现在让我们用 StringBuilder 替换它,甚至将该方法包含toString()
在测量中。
public class MainClass
{
private static long time;
public static void main(String[] args)
{
saveTime();
StringBuilder sb = new StringBuilder("Hello");
for(int i = 0; i < 100000; ++i)
{
sb.append(i);
}
String s = sb.toString();
printDiff();
}
private static void saveTime()
{
time = System.currentTimeMillis();
}
private static void printDiff()
{
System.out.println((System.currentTimeMillis() - time) + "ms");
}
}
我的电脑告诉我 10 毫秒。即 0.01 秒。我认为实践中的差异是相当明显的;粗略地说,它的运行速度append
快了700倍。这是因为,很可能“ +
”和“ +=
”本身可以调用相同的附加,但同时为了理解这样的运算符是否存在以及它是什么,已经在语言的拐杖中走了很长的路。应该做(最后一段只不过是猜测,我不是 JVM 开发人员,我不知道那里有什么以及如何做)。这是一个明显的例子,说明额外的对象并不总是昂贵的。是的,代码会长几行,但在大型项目中节省的时间可能是巨大的。请注意,这些测量并不是在配备史前处理器的办公室电脑上进行的,但现在想象一下,在这台几乎无法拉动围巾的办公室电脑上,它会产生多大的变化。
GO TO FULL VERSION