如何进行比较?

---

对象的比较:==

对于基本类型(整数,浮点数,字符,布尔):比较值

对于引用类型:比较引用(地址)

为了方便比较引用指向的内容,java在Object类中提供了equals()方法

但需要注意的是,该标准方法的实现依然是通过 return this==obj,因此如要比较自定义类的内容,需要程序员自己进行方法覆盖(override)。

字符串的比较

在String类中,java已经提供了对equals()的方法覆盖实现字符串内容的比较

但我们如果需要使用==来进行String间的引用比较,可能会发现一个有趣的问题

image-20210223184714029

实际上,为了优化内存使用,java在内存中为String提供了一个称为The string pool的区域,

当我们使用 String s = "..." 声明并创建String对象时,java会先查询 "..."是否已经存在于the string pool中

如果存在,则直接将其引用赋给s,否则在pool中创建该字符串并将其引用返回给s

但是,若程序员显式的通过 new 创建对象,无论如何java都会强制在池外的内存中创建该String对象,并且不会将其加入the string pool,下面这个例子就是很好的证明:

image-20210223185615420


最后,有一个不太常用的方法 s1.intern() ,它会在the string pool中查找是否存在 String s1,存在则返回其引用,否则将s1加入池中在返回其引用。

posted @ 2021-02-24 15:46  盐盐盐の锅  阅读(468)  评论(0编辑  收藏  举报