我已经读过有关intern()的信息,几乎所有地方都写到它会使用==而不是equals()来加速字符串比较。
String a = new String("1");
String b = new String("1");
Run Code Online (Sandbox Code Playgroud)
如果我是对的,上面的代码将在字符串池中创建2个字符串。但是在阅读了有关实习生的内容之后,我看不出有理由在池中保存两个具有相同值的字符串的原因。
所以问题是:为什么Java默认不使用intern()?
如果可能的话,我想获得详细的解释。
如果我是对的,上面的代码将在字符串池中创建2个字符串。
不是在字符串池中,不是。这样会在字符串池中产生一个字符串(由于string constant "1"),而在内存中的其他位置产生两个字符串(由于两次调用new String)。
为什么Java默认不使用实习生?
因为默认情况下不需要这样做。插入字符串需要工作(查找现有条目(如果有),如果不存在则添加它)。如果字符串是瞬态的(那么多的话),那是不必要的工作。因此,将其留给程序员,程序员将intern在适当时调用它。
...在任何地方都写过,它将使用==代替equals()来加速字符串比较
我不知道这个“几乎无处不在”的位置,但是==在Java中使用比较字符串是完全错误的。==比较对象引用。确实(我认为)是,如果您遍历每一个字符串并且从未忘记过,那==将是可靠的(我认为),但这根本不是最佳实践。使用equals。那就是它的目的。:-)毕竟,它将首先==检查被比较的两个字符串是否是同一对象,并且只有在错误的情况下才继续比较实际的字符...
附带说明:几乎没有任何理由显式调用new String(String)(构造函数的其他重载绝对有用,例如,当您需要使用特定字符集将字节数组转换为字符串时)。
| 归档时间: |
|
| 查看次数: |
72 次 |
| 最近记录: |