首页 > 其他分享 >128陷阱通俗理解

128陷阱通俗理解

时间:2024-07-09 10:55:14浏览次数:13  
标签:equals System println 陷阱 128 Integer 通俗 out

public class comjava {
    public static void main(String[] args) {
        int n = 128;
        int n1 = 128;
        int m = 1270;
        Integer m1 = 1270;
        Integer d = 128;
        Integer d1 = 128;
        System.out.println(n==n1);
        System.out.println(n1);
        System.out.println(m==m1);
        System.out.println(m1);
        System.out.println(d==d1);
        System.out.println(d.equals(d1));
        System.out.println(d1);

        Integer.valueOf(13);
    }
}

针对上述代码结果是什么呢?

 

128陷阱的具体表现

  • 在-128到127范围内:当你使用==操作符比较两个在这个范围内通过自动装箱创建的Integer对象时,由于它们实际上是缓存池中的同一个实例,所以比较结果为true。
  • 超出-128到127范围:对于超出这个范围的值,Java不会自动缓存Integer对象。因此,即使两个Integer对象的值相同,它们也是不同的实例,使用==操作符比较时结果为false。与==操作符不同,equals()方法在Integer类中被重写,用于比较两个对象的值是否相等,而不是它们是否是同一个实例。因此,即使两个Integer对象不是同一个实例,只要它们的值相等,equals()方法就会返回true

128陷阱的原理

主要涉及Java编程中Integer对象的比较行为,特别是与==操作符和equals()方法的使用相关。这个陷阱的核心在于Java的自动装箱(autoboxing)和整数缓存机制(Integer Cache)。

关于Integer.valueof的代码,可以看出:Java中的Integer类对于值在-128到127范围内的对象使用了一个缓存机制。这意味着当你通过自动装箱(如Integer a = 100;)在这个范围内创建一个Integer对象时,Java实际上是从一个预先存在的缓存池中获取这个值的实例,而不是创建一个新的实例。因此,所有在这个范围内通过自动装箱创建的Integer对象都会引用缓存池中的同一个实例。

如何避免128陷阱

  • 理解==和equals()的区别:使用==仅用于比较基本类型和检查对象引用是否相同;使用equals()方法来比较对象的值是否相等。
  • 明确使用equals()方法:当你需要比较两个Integer对象的值时,始终使用equals()方法,而不是==。
  • 警惕自动装箱:了解自动装箱和拆箱的行为及其在代码中的作用,尤其是当处理大范围的整数时。

结论

128陷阱是Java开发中容易遇到的一个问题,特别是在处理Integer对象的比较时。理解整数缓存机制和正确使用equals()方法是避免这个陷阱的关键。

标签:equals,System,println,陷阱,128,Integer,通俗,out
From: https://blog.csdn.net/2302_80155670/article/details/140289171

相关文章

  • JAVA基础-----128陷阱
    一、何为128陷阱Java中Integer类型在使用==比较时的特殊行为------128陷阱,解释了当数值在-128到127范围内,由于valueOf方法的缓存机制导致地址相同,比较为真;超出这个范围则新分配内存,地址不同,比较为假。可以预测一下下面程序的输出结果:答案在最后后面!二、造成该现象的原因......
  • 128陷阱详解+源码分析
    128陷阱详解1、什么是128陷阱2、为什么会出现128陷阱3、避免128陷阱的方法1、什么是128陷阱请看下面的程序,注释为运行结果。 Integerb=127; Integerb1=127; System.out.println(b==b1);//true Integerc=128; Integerc1=128; System.out.pr......
  • __int128
    目录简介支持运算输入输出例题简介\(\_\_int128\)并不是标准c/c++中的数据类型,而是一些特定编译器如gcc/g++提供的扩展数据类型。支持运算\(\_\_int128\)的是有符号128位整数变量,最多表示39位整数。支持基本的加减乘除运算,以及按位与&、按位或|、按位异或^、左移<<、右移>......
  • 推荐一个新手如何进阶玩转 GitHub 的开源项目,通俗易懂!(带私活源码)
    今天,给大家分享的是一个新手如何进阶玩转GitHub的开源项目。此新手,非彼新手。作者之前确实是没怎么用GitHub,但是人家是作者,作者不仅仅是写了篇文章那么简单。。。这个作者是《Git权威指南》的作者!!GotGitHub是GitHub的详细完整的权威介绍。1.为什么会有这个开源博客?......
  • 16位数据转128位数据
    输入数据:data_in[15:0]  valid_in输出数据:data_out[127:0] valid_out思维逻辑很简单,看仿真。valid_out计数到7的时候拉高一次即可。moduledata_16_128(inputclk,inputrst_n,inputvalid_in,input[......
  • 如何通俗易懂的理解雅可比矩阵
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、雅可比矩阵是什么?二、更具体的解释:1.多变量函数2.偏导数3.雅可比矩阵为什么雅可比矩阵重要?总结前言雅可比矩阵(Jacobianmatrix)是一个重要的数学概念,尤其在多变量函数微分学中有着广......
  • 如何理解vuex中的每个概念(通俗易懂)
    文章目录1.什么是Vuex?2.Vuex的四个核心概念1.什么是Vuex?想象一下,你家里有一个大冰箱,所有家庭成员都可以访问这个冰箱。每个人都可以往里面放东西,也可以从里面拿东西。这个冰箱就像是Vuex中的“状态”,每个家庭成员(Vue组件)都可以共享这个状态。2.Vuex的......
  • rk3128 android4.4找不到内部存储空间
    修改如下:device/rockchip/rk312xdiff--gita/fstab.rk30board.bootmode.emmcb/fstab.rk30board.bootmode.emmcindex4b04d83..276b77b100755---a/fstab.rk30board.bootmode.emmc+++b/fstab.rk30board.bootmode.emmc@@-8,10+8,10@@/dev/block/platform/1021c000.......
  • 看过我的二极管文章后,再来学习下三极管知识,全网最通俗易懂的内容,保证你看的懂
        三极管(也称晶体管),全称应为半导体三极管,也称双极型晶体管、晶体三极管,是一种控制电流的半导体器件。    晶体三极管的主要作用是放大和控制电流或电压。其放大作用是通过控制输入信号的小变化来改变输出信号的大变化。而控制作用是根据输入信号的大小和类......
  • 【技海探究·匠心筑梦】I‘mAlex的CSDN 128天创作纪念日:从初心到憧憬
    【技海探究·匠心筑梦】I‘mAlex的CSDN128天创作纪念日:从初心到憧憬......