相等,还是不等(2) - "fly-weight"
入门。
知识点 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!");