gpt4 book ai didi

java - 为什么创建一个新的String默认不使用intern()?

转载 作者:行者123 更新时间:2023-11-29 09:58:36 26 4
gpt4 key购买 nike

我读过关于 intern() 的文章,几乎所有地方都写到它会通过使用 == 而不是 equals() 来加速字符串比较。

String a = new String("1");
String b = new String("1");

如果我是对的,上面的代码将在字符串池中创建 2 个字符串。但是在阅读了有关实习生的信息后,我看不出有什么理由在池中保存 2 个具有相同值的字符串。

那么问题来了:为什么java默认不使用intern()?

如果可能的话,我想得到详细的解释。

最佳答案

If I am right, code above will create 2 strings in string pool.

不在字符串池中,不。这会在字符串池中生成 一个 字符串(因为字符串常量 "1")和内存中其他地方的两个字符串(因为两次调用 new String )。

why java doesn't use intern by default?

因为默认情况下不需要这样做。实习一个字符串需要工作(如果有的话找到现有的条目,如果不存在则添加它)。如果字符串是 transient 的(很多都是 transient 的),那是不必要的工作。因此,将其留给程序员,他们将在适当时调用 intern


...almoust everywhere written that it will speed up string comparition by using == instead equals()

我不知道这个“几乎无处不在”在哪里,但是使用 == 来比较字符串在 Java 中是完全错误的。 == 比较对象引用。虽然这是真的(我认为)如果你实习每一个字符串并且永远不会忘记,那么 == 将是可靠的(我 认为),但它不是最佳实践全部。使用 equals。这就是它的用途。 :-) 毕竟,它会首先执行 == 来查看正在比较的两个字符串是否是同一个对象,只有当它是 false 时才继续比较实际的字符...


只是一个旁注:几乎没有任何理由显式调用 new String(String)(有 其他 绝对有用的构造函数重载,例如当您需要使用特定字符集将字节数组转换为字符串时)。

关于java - 为什么创建一个新的String默认不使用intern()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58570565/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com