如何解决Java - 使用 new String() 或 valueOf(char[])
我正在将应用程序从 Java 8 升级到 Java 9。 工作是几年前由不再在公司工作的人开始的。
他们用 new Integer(int)
代替了 Integer.valueOf()
我知道这在避免不必要的对象方面具有优势,并且已阅读有关该主题的几篇文章,包括 Joshua Bloch on Considering static factory methods instead of constructors
替换代码是否有任何价值,例如
val x = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C")
与
String.valueOf(new char[] { 'A','\u00ea','\u00f1','\u00fc','C' })
类似的,如果你会更新
new String[]{"alpha","beta","plabelColor"};
解决方法
不要引入微观优化,如果您无法衡量影响并且需要优化。
我们在这里讨论的是微小的微优化。如果您的应用程序不是高频交易应用程序,其中每一纳秒都很重要,那么您应该更喜欢代码的可读性而不是微优化。这些优化甚至可能会在编译(或重新发布更新的编译器优化)后产生相同的代码。此类优化几乎不会对您的用户可衡量的响应时间产生任何影响。
如果您想衡量影响,我建议您使用 JMH。
,用 new Integer(int)
替换 Integer.valueOf(int)
是(不仅仅是)一个好主意 - new Integer(int)
已被弃用(Java 9)并标记为删除(Java 16)。
val x = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C")
不是真正的 Java;如果是 Java,我会推荐 var x = "A" + "\u00ea" + "\u00f1" + "\u00fc" + "C"
甚至 var x = "A\u00ea\u00f1\u00fcC"
(除非需要一个新的非实习字符串(不知道为什么))
new String[]{"alpha","beta","plabelColor"}
- 无需更新
似乎没有理由用 new String(char[])
替换 String.valueOf(char[])
,实际上后者很可能只是通过执行前者来实现的 - 这是 String
类的源代码来自JDK 9,例如 (link):
public static String valueOf(char data[]) {
return new String(data);
}
所以唯一的区别是一个额外的方法调用(最多由 JIT 内联)。另一方面,如果有差异,则差异极小,不值得考虑,因此与其考虑性能,不如根据您认为更具可读性的方式进行选择。
也就是说,您示例中的代码没有使用 new String(char[])
构造函数,而是使用 new String(String)
构造函数复制字符串。这不是必需的,您可以只编写创建字符串的表达式而不调用构造函数,除非您的代码出于某种原因要求不实习字符串对象(如果确实如此,这对我来说就像一个糟糕的设计。 )
如果您确实认为缓存常用字符串可能有一些好处,您应该自己实现缓存,将其设计为针对您的应用程序可能处理的字符串类型进行优化,然后对其进行基准测试看看它是否真的更快。您将有每次检查缓存的成本,而且对于字符串来说,这个成本可能比整数更大,尤其是当它涉及散列和测试字符串的相等性时;因此,如果缓存未命中太多,那么净效应将是负面的。缓存未命中率将高度依赖于您的应用程序,因此您确实希望使用真实数据进行基准测试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。