微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java - 使用 new String() 或 valueOf(char[])

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?