zoukankan      html  css  js  c++  java
  • Integer值判断是否相等问题

     定义了两个Integer变量,暂且定义为Integer a; Integer b;

    这两个值由前端赋值并传到后台,前台传的是a = 12345, b = 12345, 但我在后台比较的时候 if (a == b),却返回false,好无语啊,不都是123吗?为什么返回false,后来改为equals(),返回true,但其中的有些端倪还不太清楚,现总结下:

    我们知道Integer是int的包装类,在jdk1.5以上,可以实现自动装箱拆箱,就是jdk里面会自动帮我们转换,不需要我们手动去强转,所以我们经常在这两种类型中随意写,平时也没什么注意但Integer他是对象,我们知道 == 比较的是堆中的地址,但有个奇怪的事是, 如果 Integer a = 123, Integer b = 123,可以返回true,但如果Integer a = 12345, Integer b = 12345,返回false,这就是jdk的东西,我们看下Integer的源码。

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

    默认IntegerCache.low 是-127,Integer.high是128,如果在这个区间内,他就会把变量i当做一个变量,放到内存中;但如果不在这个范围内,就会去new一个Integer对象,

    而我在代码中,两个Integer值都不在这个范围内,所以jdk帮我new了两个实例,这样在用==,肯定是false。

    所以如果要比较Integer的值,比较靠谱的是通过Integer.intValue();这样出来的就是int值,就可以直接比较了;或者equals()比较

    public static void main(String[] args) {
            Integer a1 = Integer.valueOf(60);  //danielinbiti
            Integer b1 = 60;  
            System.out.println("1:="+(a1 == b1));   
            
    
            Integer a2 = 60;  
            Integer b2 = 60;  
            System.out.println("2:="+(a2 == b2));  
            
    
            Integer a3 = new Integer(60);  
            Integer b3 = 60;  
            System.out.println("3:="+(a3 == b3));  
            
            Integer a4 = 129;  
            Integer b4 = 129;  
            System.out.println("4:="+(a4 == b4));  
        }

    这段代码的比较结果,如果没有执行不知道各位心中的答案都是什么。

    要知道这个答案,就涉及到Java缓冲区和堆的问题。

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

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

    所以,以后碰到Integer比较值是否相等需要用intValue()

    对于Double没有缓冲区。

    答案

    1:=true
    2:=true
    3:=false
    4:=false

  • 相关阅读:
    Bootstrap3.0入门学习系列教程
    Python——五分钟理解元类(metaclasses)
    Python内置模块和第三方模块
    vs的任务列表
    web.config or app.config 中configSections配置节点
    将查询到的数据导出到Excel终结版
    MVC的一些常用特性,持续更新中。。。
    前端——扫码枪扫码
    前后台数组互传问题解答
    C# 实体/集合差异比较,比较两个实体或集合值是否一样,将实体2的值动态赋值给实体1(名称一样的属性进行赋值)
  • 原文地址:https://www.cnblogs.com/jack-Star/p/7273837.html
Copyright © 2011-2022 走看看