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



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

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

如果我是对的,上面的代码将在字符串池中创建2个字符串。但在阅读了关于intern的文章后,我认为没有理由在池中保存两个具有相同值的字符串。

所以问题是:为什么java默认不使用inter((?

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

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

不在字符串池中,不。这会在字符串池内产生一个字符串(因为字符串常量"1"(,并在内存中的其他位置产生两个字符串(因为对new String的两个调用(。

为什么java默认不使用intern?

因为默认情况下没有必要这样做。实习字符串需要工作(如果有现有条目,则查找该条目,如果没有则添加该条目(。如果字符串是瞬态的(很多都是瞬态的(,那么这是不必要的工作。因此,将它留给程序员,如果合适的话,程序员将调用intern


。。。almoust everywhere写道,它将通过使用==而不是equals((来加快字符串比较

我不知道这个"几乎无处不在"在哪里,但在Java中使用==来比较字符串是完全错误的。==比较对象引用。虽然确实(我认为(,如果你练习了每一个字符串,并且从未忘记,那么==将是可靠的(我认为(,但这根本不是最佳实践。使用equals。这就是它的用途。:-(毕竟,它将从==开始,看看被比较的两个字符串是否是同一个对象,只有当这是false时,才继续比较实际的字符。。。


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

最新更新