千家信息网

Java修改Integer变量值遇到的问题及解决方法

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,这篇文章主要介绍"Java修改Integer变量值遇到的问题及解决方法",在日常操作中,相信很多人在Java修改Integer变量值遇到的问题及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好
千家信息网最后更新 2025年02月02日Java修改Integer变量值遇到的问题及解决方法

这篇文章主要介绍"Java修改Integer变量值遇到的问题及解决方法",在日常操作中,相信很多人在Java修改Integer变量值遇到的问题及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Java修改Integer变量值遇到的问题及解决方法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目录
  • Java 修改Integer变量值

    • 下面我尝试了两种方法去改变Integer的整型值

    • 看看源码

  • Integer值比较需要注意的问题

    • 原因

    • 解决办法

Java 修改Integer变量值

对于Integer变量来说,比较变量值常见情形如下:

Integer a = 1000;      Integer b = 1000;      Integer c = 100;      Integer d = 100;      System.out.println(a == b);      System.out.println(c == d);

"=="比较的是地址的值,所以正确答案是false,true;

当我们对一个Interger变量直接用"="号赋值时,相当于自动装箱,即把右边的int型变量(整数时默认是int) 转换成Integer变量,另外我们看看源码

/**          * Returns an {@code Integer} instance representing the specified          * {@code int} value.  If a new {@code Integer} instance is not          * required, this method should generally be used in preference to          * the constructor {@link #Integer(int)}, as this method is likely          * to yield significantly better space and time performance by          * caching frequently requested values.          *          * This method will always cache values in the range -128 to 127,          * inclusive, and may cache other values outside of this range.          *          * @param  i an {@code int} value.          * @return an {@code Integer} instance representing {@code i}.          * @since  1.5          */          public static Integer valueOf(int i) {              assert IntegerCache.high >= 127;              if (i >= IntegerCache.low && i <= IntegerCache.high)                  //当为-128和127之间时,并没有new一个Integer,而是从缓存中取                  return IntegerCache.cache[i + (-IntegerCache.low)];              return new Integer(i);          }

所以说如果int的值为-128到127时,是从常量池里取的Integer变量,所以"c==d"是对的,因为c、d是100

而"a==b"为false,因为他们的值为1000,所以是在堆里new出两个不同的变量。

这些都很好理解,但是怎么改变Integer的整型值呢?

下面我尝试了两种方法去改变Integer的整型值

(1)

有这么一个方法

public void ceshi(Integer integer){    integer=4444;}

main方法

Integer shuzi=new Integer(100);new Test55().ceshi(shuzi);System.out.println(shuzi);

输出的结果却还是100而不是444

再来看看

(2)

main方法

Integer shuzi=new Integer(100);shuzi=5000;System.out.println(shuzi);

这回输出的结果却又是5000,为什么(1)和(2)都用了"="号赋值,一个成功,一个却失败了?

看看源码

Integer的源码:

/** * The value of the {@code Integer}. * * @serial */private final int value;

Integer变量里的value明明就是final变量,照理说是不能够修改的,那为什么(2)却成功了?

因为:在(2)的这个情况里,我对它赋值5000,相当于new了一个新的Integer变量,它的value值是5000,然后把这个新的变量赋给"shuzi"这个变量,原来那个value值为100的Integer变量就被覆盖了,除非我用一个副本保存,不然他就会被GC清除了。

还有一个问题:那为什么(1)改变不了?

因为:我们先要知道,Java 只有值传递,只不过值传递分为:内存中数值的值传递以及内存地址数值的值传递,传递一个Integer变量参数进去,实际上是构建了一个副本,通过这个副本我们只能去修改原来Integer变量的非final成员变量(假如有的话,也可以是其他类型),上面也说了,如果去修改Integer类型的final变量,那么是会新new一个Integer变量,去覆盖这个变量副本,所以原来的Integer变量还是原来的,仅仅是"ceshi"这个方法里的副本变量变了,这么理解就清楚了。

Integer值比较需要注意的问题

package com.com.test; /** * Created by ***** 2018/6/29 9:18 * java中Integer类型对于-128-127之间的数是缓冲区取的, *  所以用等号比较是一致的。但对于不在这区间的数字是在堆中new出来的。所以地址空间不一样,也就不相等。 */public class IntegerTest {    public static void main(String[] args) {        Integer a1 = Integer.valueOf(60);  //danielinbiti        Integer b1 = 60;        System.out.println("1:="+(a1 == b1));  //true          Integer a2 = 60;        Integer b2 = 60;        System.out.println("2:="+(a2 == b2));   //true          Integer a3 = new Integer(60);        Integer b3 = 60;   // 装箱过程也就是Integer b3=Integer.valueOf(60)        System.out.println("3:="+(a3 == b3));    //false//        System.out.println("3:="+(a3.equals(b3)));   //true         Integer a4 = 129;//大于127时,在堆中新建        Integer b4 = 129;        System.out.println("4:="+(a4 == b4));  //false//        System.out.println("4:="+(a4.equals(b4)));    //true    }}

代码如上所示,运行结果在注释后。

原因

java中Integer类型对于-128-127之间的数是缓冲区取的,所以用等号比较是一致的。但对于不在这区间的数字是在堆中new出来的。所以地址空间不一样,也就不相等。

Integer b3=60,这是一个装箱过程也就是Integer b3=Integer.valueOf(60)

解决办法

使用 equals 代替 "==",即是前者可能在性能上稍逊于后者,但是用后者的话存在bug的可能性。

到此,关于"Java修改Integer变量值遇到的问题及解决方法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

变量 方法 问题 副本 地址 源码 类型 学习 之间 是在 结果 量值 装箱 一致 成功 也就是 内存 办法 区间 原因 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 天谕手游服务器排行榜 游戏服务器崩溃多长时间修复 江门软件开发公司前十 湖州智能化网络技术来电咨询 公司服务器的管理 网络爬虫软件开发 数据库装完重启就蓝屏 深圳能耗管理软件开发多少钱 网络安全宣传周河南 本地数据库文件备份 共享文件夹服务器 网络安全的警言 王牌战争怎么开免费服务器教程 列举一种数据库的增删查改的语句 无线网络技术应用现状 浙江商城软件开发公司 企业文件服务器的作用 程序文档上传到服务器后怎么打开 裕华区网络安全督导检查 部队手机网络安全教育教案免费 大同网络安全局 法纪规范月保证书网络安全 网络数据库系统安全防护研究 并行计算数据库 重庆常规软件开发服务常见问题 基础地理信息数据库包括哪些图层 学嵌入式软件开发需要英语好嘛 深圳南山科技园工业互联网 音乐播放器数据库表关系 字节跳动网络技术工资
0