logo

相等,还是不等(2) - "fly-weight"

Last Updated: 2023-02-24

入门。

知识点 1:某些面向对象的编程语言,比如 Java,既有 primitive 的数,也有被封装到 object 里的。

jshell> Integer.valueOf(1000) == 1000
$1 ==> true

知识点 2:Java 的字符串都是 immutable 的,一旦生成不能更改。

jshell> String a = "asdf";
a ==> "asdf"

jshell> String b = "asdf";
b ==> "asdf"

jshell> a == b
$1 ==> true

放弃?

比较整数

jshell> Integer.valueOf(6) == Integer.valueOf(6)
$1 ==> true

jshell> Integer.valueOf(1000) == Integer.valueOf(1000)
$2 ==> false

比较字符串

Comparing two same strings in Java:

System.out.println("asdf" == "asdf");
// true

System.out.println(new String("asdf") == new String("asdf"));
// false

进阶!

这两个都是 "fly-weight" pattern 的例子.

-128 to 127 之间的整数会被预存(因为最常用?),所以所有的Integer.valueOf(6)都返回的是同一个 object, 而这个范围之外的会生成一个新的 Integer,所以等号两侧的是两个不同的 object。

Java source code:

public static Integer More ...valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

对于字符串,string literal 是从 constant pool 中返回,所以他们指向相同的字符串,而new String()会在 heap 中新建 object

// string literal, created in constant pool
String greeting = "Hello world!";

// created in heap
String greeting = new String("Hello world!");