2016-03-08 98 views
0

Strings是不可变的对象并存储在字符串池中。假设在应用程序中没有任何字符串是使用new运算符创建的。在这种情况下,还需要使用equals方法,而不是对String对象相等性检查吗? 我觉得上述问题的答案可能是“是”,它与字符串池大小有关。 如何管理字符串池?内存有限,所以我觉得String pool也有一定的大小。它是否像LRU缓存一样工作,在池满时丢弃最少使用的字符串?字符串池管理

请提供您的宝贵意见。

我的问题不是关于字符串池的大小。我的问题是,如果没有任何字符串使用new运算符,那么使用==将始终是安全的。这个陈述是正确的还是可能发生的,在这种情况下,两个具有相同字符串字符串的字符串可能会返回false。我知道设计明智,我应该总是使用equals方法,但我只是想知道语言规范。

+3

我认为应该使用'equals()',而不管字符串是否被创建为通常的'new'。 –

+0

可能重复[如果字符串池的大小超过?](http://stackoverflow.com/questions/10224476/what-if-size-of-string-pool-exceeds) –

+3

我与@TimBiegeleisen。当然有些情况下你可以使用'==',但我认为它只是说“看看我有多聪明,我打败了系统”。然后有一天它停止工作,你不再那么聪明了。即使它继续工作。每个审查你的代码的人都会选择它,你必须解释 - 直到你厌倦了它,并在你的代码中评论每一个'stringOne == stringTwo'来解释它的工作原理,因为你太聪明了。只要按照正常的方式去做,避免所有问题! – John3136

回答

3

字符串是不可变的对象,存储在字符串池中。假设在应用程序中没有任何字符串是使用new运算符创建的。在这种情况下,是否有必要使用equals方法而不是==来进行String对象的相等性检查?

如果你总是使用equals()你永远不用担心这个问题的答案,但除非你只打算比较字符串文字,否则情况永远不可能出现。

我觉得上面的问题的答案或许是肯定

正确的。

它与字符串池的大小有关。

是如何串池来管理?内存有限,所以我觉得String pool也有一定的大小。

它的工作原理就像LRU缓存,丢弃最少使用的字符串时,池已满?

不,但是已经被intern() -ed的字符串可以从池中垃圾收集。

+0

@EJB感谢您的回答。我编辑了我的问题,我知道对象equals应该用作==比较对象是否相同并且不检查thw内容。我想了解一些有关语言规范的参考信息。 –