==
比较对象/字符串/任何东西的地址
.equals()
旨在使用对象的内部状态进行比较。
所以:
new Object() == new Object() => false
- 内存中不同地址的两个独立对象。
new String("a") == new String("a") => false
- 相同的情况 - 字符串对象的两个单独地址。
new String("a").equals(new String("a")) => true
- 地址不同,但 Java 将采用一个对象状态 ('a') 并与其他对象状态 ('a') 进行比较,发现它们相等并报告为真。
使用 equals() 方法,您可以以任何适合您的程序的方式对比较进行编码。
intern()
是一个有点不同的故事。它旨在为相同的字符序列返回相同的对象(地址)。当您多次构造相同的字符串时,减少所需的内存量很有用。
new String("aaa").intern()
如果曾经有人创建过“aaa”字符串,将在机器内存中寻找,并将返回字符串的第一个实例......如果没有找到 - 当前的将被列为第一个和所有进一步的“aaa”。实习生() 和 newString("aaa").intern()
并将("a"+"aa").intern()
返回那个“第一个”实例。
当心:"aaa".intern()
操作不是很快,如果您将实习所有字符串 - 您将节省一些内存,但会丢失相当多的 CPU 工作。