我是靠谱客的博主 伶俐可乐,最近开发中收集的这篇文章主要介绍128陷阱,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

128陷阱指的是什么?看一下下面的代码


Integer a = -128;
Integer b = -128;
Integer c = 128;
Integer d = 128;
System.out.println(a==b);
System.out.println(c==d);

输出是 true 和false

为什么赋值128的时候会是false呢?不都是128吗?赋值-128怎么就true了呢?

从引用类型的角度来讲,每次赋值都要new一块内存空间来存放数据,内存地址都是不同的啊,为什么会出现true呢?

这里涉及到了自动拆装箱问题,可以看我的另一篇博客:

 java 自动装箱、拆箱_m0_53611007的博客-CSDN博客

我们看一下这个java文件的字节码文件的反编译代码

 发现每次赋值都调用了Integer.valueOf这个方法我们点进这个方法看一下源码,层层进去就会发现问题,其中有一个方法这么写的

 这里有三个变量low , high 和cache ,看一下这三个变量

 发现low定义号了128,cache是一个数组

在源码的静态代码块中有给high和cache赋值的代码,high=127

所有的-128到127的数字都被放进了cache缓存,

所以我们给Integer赋值的时候这个缓存内的数字可以直接取出,都指向了同一块地址,而这个缓存之外的数字就不行了

最后

以上就是伶俐可乐为你收集整理的128陷阱的全部内容,希望文章能够帮你解决128陷阱所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部