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

new String()与literal String的性能

谭裕
2023-03-14

这个问题在StackOverflow上被问过很多次,但没有一次是基于性能的。

在《Effective Java书籍》中给出了

改进的版本简单如下:String s=“Stringette”;此版本使用单个String实例,而不是每次执行时都创建一个新的String实例。

因此,我尝试了这两种方法,发现性能有了显著改善:

for (int j = 0; j < 1000; j++) {
    String s = new String("hello World");
}

大约需要399 372纳秒。

for (int j = 0; j < 1000; j++) {
    String s = "hello World";
}

为什么会有这么多的性能提升?内部是否发生了编译器优化

共有1个答案

葛驰
2023-03-14

在第一种情况下,在每次迭代中创建一个新对象,在第二种情况下,总是同一个对象,从String常量池中检索。

在Java中,当您这样做时:

String bla = new String("xpto");

您强制创建一个新的String对象,这会占用一些时间和内存。

String muchMuchFaster = "xpto"; //String literal!

字符串将只在第一次创建(一个新对象),并且它将缓存在String常量池中,所以每次以它的文字形式引用它时,您都得到了完全相同的对象,这是惊人的快。

现在你可以问...如果代码中的两个不同的点检索相同的文字并对其进行更改,难道不是一定会发生问题吗?!

不,因为在Java中,字符串是不可变的,您可能很清楚!因此,任何将更改字符串的操作都将返回一个新字符串,从而使任何其他对同一字元的引用都能顺利进行。

编辑

只是澄清一下,常量池并不是String类型所独有的,您可以在这里阅读更多关于它的内容,或者如果您google for Java常量池。

http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf

String a = new String("xpto");
String b = new String("xpto");
String c = "xpto";
String d = "xpto";

System.out.println(a == b);
System.out.println(a == c);
System.out.println(c == d);
false
false
true

由于CD是同一个对象,因此==比较值成立。

 类似资料:
  • 问题内容: 我们有一个本机应用程序,它使用GPU(OpenCL)通过一种特定的方法处理大数据,并且运行得很好,没有问题。该项目的一部分(网络和分发)由进行开发,我们只需要调用本机应用程序/库即可。 我们试图使用类将其称为独立的外部过程。问题是我们无法控制应用程序(事件,处理程序,线程等)。我们还尝试将C代码转换为Java代码,但是性能下降了。除了将本机代码作为进程运行之外,我还在考虑JNA和JNI

  • 问题内容: 似乎在这么晚的时候这样做很疯狂,但是… 我正在使用Rocket Software UniVerse源和SQL目标重建一些ETL基础结构。旧的目标平台是Windows Server 2003上的SQL 2000,新的平台是Windows Server 2012上的SQL2012。在两种情况下,都使用ODBC驱动程序连接到源。一切似乎都可以在新平台上正常运行,但包的执行时间却成倍降低。例如

  • 概览 首先我们了解一下 YODAOS 的运行时:YODAOS 基于 ShadowNode 它采用事件驱动、非阻塞I/O模型;在设计之初,ShadowNode 的接口与 Node.js 兼容,因此在大部分场景下,开发者可以像 Node.js 一样使用 ShadowNode,了解这些有利于开发者更快速的进行 YODAOS 上的应用开发。 YODAOS 开发应用时,需要关注应用的性能与稳定性,包括但不限

  • 问题内容: 最近开始使用一个数据库,其中的约定是为每个表创建一个视图。如果您假设表和视图之间存在一对一的映射,那么我想知道是否有人可以告诉我这样做的性能影响。顺便说一句,这是在Oracle上。 问题答案: 假设问题是关于非具体化视图的,那么- 确实取决于该视图所基于的查询以及对其执行的操作。有时,谓词可以由优化器推入视图查询中。如果不是这样,那将不如表格本身好。视图建立在表格之上- 为什么您期望性

  • 我更喜欢Python而不是Scala。但是,由于Spark本机是用Scala编写的,出于明显的原因,我希望我的代码在Scala版本中比在Python版本中运行得更快。 基于这个假设,我想学习&为大约1 GB的数据编写一些非常常见的预处理代码的Scala版本。数据取自Kaggle上的SpringLeaf比赛。只是为了给出数据的概述(它包含1936个维度和145232行)。数据由各种类型组成,如int

  • 问题内容: 我试图弄清楚当我们使用nio FileChannel和normal FileInputStream/FileOuputStream来读写文件到文件系统时,性能(或优势)是否存在任何差异。我观察到,在我的机器上,两者的性能都相同,而且FileChannel速度也慢了很多倍。我能否请你比较这两种方法的更多详细信息。这是我使用的代码,正在测试的文件在左右350MB。如果我不考虑随机访问或其他

  • 问题内容: 由此产生的数据集只应delimters之前显示的字符串,并以正确的顺序。程序包中已经存在的“当前查询”是这样的(DDL和DML在帖子的底部): 哪些结果会生成以下数据集: PS。 我只需要专栏,但我也包括其他专栏,但确实添加了上下文。 我发现查询有点混乱并且难以阅读,因此我尝试使用@vkp并提出了建议,我想出了以下查询,结果与上面的数据集相同。 然而,从@ MathGuy的答案,似乎和

  • 问题内容: 我正在尝试对我们的客户代码进行基准测试。因此,我决定编写一个多线程程序来对我的客户端代码进行基准测试。我正在尝试测量下面的方法需要多少? 因此,下面是我编写的用于对上述方法进行基准测试的多线程代码。在两种情况下,我看到了很多变化- 1)首先,使用和来处理多线程代码。我得到95%的。我正在使用- 2)但是,如果我运行相同的程序以使用- 代替 当我使用运行代码时,我得到95%,比上面的数字