128陷阱是什么?

蔚落 2024-03-17 21:20 163阅读 0赞

1334c0794eb84cecb74014c9987b8456.png 9c5e7cf2bc0b473e888f4b3a5491de5f.png

这是著名的128陷阱。

为什么从128开始,后边结果就不一样了呢?

首先我们要知道,Integer有一个数组cache[ ],它的范围是-128~127,当Integer类型的变量a和b在-128~127时,是直接指向常量池中的缓存地址,a和b指向的都是cache[ ]中的127。但当值超过这个范围时,是用new重新开辟内存空间,新开辟的地址不同,所以c==d的结果是false。

Integer a=127; 这行代码是将整型的127赋给了Integer(引用型)的a。是Java编译器替我们执行了一个方法,这个方法把int封装成了Integer类型,然后赋给了a,这个就是自动装箱。(valueOf()方法)

自动拆箱就是反过来,把Integer类型的a赋给了整型的e。Java编译器替我们执行了把Integer拆成int的一个方法。(intValue()方法)

78c8a9d2876e43f89f3afc6d811d8fd4.png

看完上面这些,你应该有一定了解了吧?我找来了一个面试题,判断一下:

21ff146dd1aa42e096c1a71edeef635b.png

结果是:true true false

ecf6987cb7ce4afca55c192f761ad89e.png

解析:

1、int a 和 Integer b,两者用==比较时,两者不是同一数据类型,b自动拆箱,所以a==b,true。

2、Integer c 和 Integer d 两者是同一数据类型(无拆装箱),并且在-128~127范围内, true。

3、还是c和d,两者都是Integer型(无拆装箱),但是200在-128~127范围以外,需要新开辟内存空间,所以是false。

发表评论

表情:
评论列表 (有 0 条评论,163人围观)

还没有评论,来说两句吧...

相关阅读