编程:从入门到放弃
    前言
    语言和环境
    +=
    C和C++
    Hex
    Map
    Scope(1):"这"是啥
    Scope(2)
    Singleton
    什么顺序
    从A到Z
    函数
    切分字符串
    初始化(1)
    初始化(2)
    单引号,还是双引号
    参数传递
    左,还是右
    引用
    时间(1)
    时间(2)
    时间(3)
    时间(4)
    时间(5)
    比大小
    流氓甘地
    相等,还是不等(1)
    相等,还是不等(2)
    相等,还是不等(3)
    相等,还是不等(4)
    第一个说了算,还是最后一个
    语言和环境
    除以0
    随机数

相等,还是不等(2)

Updated: 2021-12-12

入门。

知识点 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!");