首先我們知道Integer和String的equals都重寫過,比較的是對象的value字段,這個問題很簡單.
而Integer和String用==判斷時,比較的都是地址,就需要討論了.
先說結論
使用直接賦值或valueOf()方法時,Integer和String都會查緩存,緩存中有就返回緩存中的地址,沒有則新建.
使用new Integer()和new String()方法都不查緩存,直接創建新對象,返回新地址.
知識補充
Integer類中有一個靜態代碼塊,他初始化了一個cache數組,數組存的值是[-128,127],這是Integer的緩存範圍,是不變的.
String類在jvm內存中有一個字符串常量池,你創建的新字符串常量會被加入其中,該池作爲String的緩存.