java jdk缓存-128~127的Long与Integer
生活随笔
收集整理的這篇文章主要介紹了
java jdk缓存-128~127的Long与Integer
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
先推斷下以下代碼的輸出結(jié)果
Qa:----------------------------------------------
Long a = Long.valueOf(127);
????????? Long b = Long.valueOf(127);
????????? System.out.println(a == b); Qb:---------------------------------------------------
Long a = Long.valueOf(128);
????????? Long b = Long.valueOf(128);
????????? System.out.println(a == b); --------------------------------------------------------
Qa:true? Qb:false
當(dāng)時發(fā)現(xiàn)這個的問題起因是有同事把一個id屬性由long改為大Long,導(dǎo)致一些地方用=比較id值出現(xiàn)了不一致的情況,終于導(dǎo)致了使用我們產(chǎn)品的部分人反饋某些功能不能夠使用了,我這里所說的部分人就是那些人持有的id屬性值超過127的用戶。
非常明顯,這些地方不能夠用 == 去比較兩個Long類型,這也反映一個程序猿的細(xì)心程度,小心轉(zhuǎn)換這樣的基本類型到自己定義類型。我這里主要解釋下為什么-128~127 用==返回true。
看jdk關(guān)于Long類型的源代碼: public static Long valueOf(long l) {
?? ?final int offset = 128;
?? ?if (l >= -128 && l <= 127) { // will cache
?? ???? return LongCache.cache[(int)l + offset];
?? ?}
??????? return new Long(l);
??? }
private static class LongCache {
?? ?private LongCache(){}
?? ?static final Long cache[] = new Long[-(-128) + 127 + 1];
?? ?static {
?? ???? for(int i = 0; i < cache.length; i++)
?? ??? ?cache[i] = new Long(i - 128);
?? ?}
??? }
能夠看到-128到127間的值北放到了一個數(shù)組中,即代碼中的LongCache.cache[],所以我們拿到的是同一個實(shí)例,同理其他大類型也是相同,能夠在看下Integer驗(yàn)證下
Qa:----------------------------------------------
Long a = Long.valueOf(127);
????????? Long b = Long.valueOf(127);
????????? System.out.println(a == b); Qb:---------------------------------------------------
Long a = Long.valueOf(128);
????????? Long b = Long.valueOf(128);
????????? System.out.println(a == b); --------------------------------------------------------
Qa:true? Qb:false
當(dāng)時發(fā)現(xiàn)這個的問題起因是有同事把一個id屬性由long改為大Long,導(dǎo)致一些地方用=比較id值出現(xiàn)了不一致的情況,終于導(dǎo)致了使用我們產(chǎn)品的部分人反饋某些功能不能夠使用了,我這里所說的部分人就是那些人持有的id屬性值超過127的用戶。
非常明顯,這些地方不能夠用 == 去比較兩個Long類型,這也反映一個程序猿的細(xì)心程度,小心轉(zhuǎn)換這樣的基本類型到自己定義類型。我這里主要解釋下為什么-128~127 用==返回true。
看jdk關(guān)于Long類型的源代碼: public static Long valueOf(long l) {
?? ?final int offset = 128;
?? ?if (l >= -128 && l <= 127) { // will cache
?? ???? return LongCache.cache[(int)l + offset];
?? ?}
??????? return new Long(l);
??? }
private static class LongCache {
?? ?private LongCache(){}
?? ?static final Long cache[] = new Long[-(-128) + 127 + 1];
?? ?static {
?? ???? for(int i = 0; i < cache.length; i++)
?? ??? ?cache[i] = new Long(i - 128);
?? ?}
??? }
能夠看到-128到127間的值北放到了一個數(shù)組中,即代碼中的LongCache.cache[],所以我們拿到的是同一個實(shí)例,同理其他大類型也是相同,能夠在看下Integer驗(yàn)證下
總結(jié)
以上是生活随笔為你收集整理的java jdk缓存-128~127的Long与Integer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不透明度opacity进阶
- 下一篇: 5月22日阿里云网络变更公告