---
对象的比较:==
对于基本类型(整数,浮点数,字符,布尔):比较值
对于引用类型:比较引用(地址)
为了方便比较引用指向的内容,java在Object类中提供了equals()方法
但需要注意的是,该标准方法的实现依然是通过 return this==obj,因此如要比较自定义类的内容,需要程序员自己进行方法覆盖(override)。
字符串的比较
在String类中,java已经提供了对equals()的方法覆盖实现字符串内容的比较
但我们如果需要使用==来进行String间的引用比较,可能会发现一个有趣的问题
实际上,为了优化内存使用,java在内存中为String提供了一个称为The string pool的区域,
当我们使用 String s = "..." 声明并创建String对象时,java会先查询 "..."是否已经存在于the string pool中
如果存在,则直接将其引用赋给s,否则在pool中创建该字符串并将其引用返回给s
但是,若程序员显式的通过 new 创建对象,无论如何java都会强制在池外的内存中创建该String对象,并且不会将其加入the string pool,下面这个例子就是很好的证明:
最后,有一个不太常用的方法 s1.intern() ,它会在the string pool中查找是否存在 String s1,存在则返回其引用,否则将s1加入池中在返回其引用。