繁体   English   中英

为什么默认情况下不使用 intern() 创建新字符串?

[英]Why doesn't the creation of a new String use intern() by default?

我已经阅读过有关 intern() 的内容,几乎所有地方都写到它将通过使用 == 而不是 equals() 来加速字符串比较。

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

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

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

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

如果我是对的,上面的代码将在字符串池中创建 2 个字符串。

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

为什么 java 默认不使用实习生?

因为默认情况下不需要这样做。 实习字符串需要工作(如果有则查找现有条目,如果不存在则添加它)。 如果字符串是瞬态的(很多都是),那是不必要的工作。 因此,把它留给程序员,如果合适的话,他们会打电话给intern


...几乎到处都写到它将通过使用 == 而不是 equals() 来加速字符串比较

我不知道这个“几乎无处不在”在哪里,但是在 Java 中使用==来比较字符串是完全错误的。 ==比较 object 参考。 虽然(我认为)确实,如果你对每一个字符串都进行了实习并且从未忘记过,那么==将是可靠的(我认为),但这根本不是最佳实践。 使用equals 这就是它的用途。 :-) 毕竟,它将首先执行==来查看被比较的两个字符串是否相同 object,并且仅当这是错误的 go 时才比较实际字符...


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM