千家信息网

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

发表于:2024-10-07 作者:千家信息网编辑
千家信息网最后更新 2024年10月07日,这篇文章主要介绍"Java修改Integer变量值遇到的问题及解决方法",在日常操作中,相信很多人在Java修改Integer变量值遇到的问题及解决方法问题上存在疑惑,小编查阅了各式资料,整理出简单好
千家信息网最后更新 2024年10月07日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安全错误 数据库的锁怎样保障安全 民间数据库打开食品安全治理 常州中环网络技术有限公司 中国电信网络安全员 广西学校时钟同步服务器 太原网络安全资讯 前端后端与数据库如何工作 搜索软件网络安全 每个铁路局都有网络安全中心么 做好网络安全检查下半篇文章 list怎么添加数据库 网络安全专业移民北欧 数据库字段设计布尔类型 英特尔服务器开机卡住 郑州大学数据库实验报告 邮政银行软件开发面试流程 龙岗区网络技术进出口价格走势 通讯协议软件开发什么意思 锦江区慧龙软件开发工作室 政法委网络安全工作下步打算 杭州九旺网络技术有限公司6 想学软件开发要去哪里学 数据库分为网络数据库 甲公司为财务软件开发公司 天津澜希互联网科技有限责任公司 网络安全知识摘抄 网络技术中的关键路线 网络安全征文800字免费 根据数据库表生成bean 查询数据库名 软件开发可选择的题目
0