• 关于Integer类的值使用==比较


    题记:前几天面试Java基础给来了个面试题Integer a=100,b=100;System.out.println(a==b); 当时回答是true,后来面试官又来了一个Integer a=200,b=200;System.out.println(a==b); 这个回答的也是true当时面试官笑笑说恭喜你回答错误,当时一愣回来才想起int的范围。

    补充:

    Java如何查看对象的内存地址?Java是使用hashcode来表示对象的内存地址,两个相同的对象的hashcode是相同的,
    我们可以使用System.identityHashCode(传输进去的参数是一个对象)打印对象的hashcode值。

    分析:

    我们都知道基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址
    这里肯定你也会和我有一样的疑问为什么200的时候是false,100的时候是true,应该Integer包装对象都是比较的应该是内存的地址都应该是false才对啊!
    这里请看源码:


    当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。

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

    由源码我们可以看到Integer的范围是“-128~127”,当i在这个范围内是从IntegerCache中直接获取,当超越这个范围才会new 一个新的Integer对象

    这里有一点需要解释:

    一个Integer 与 int比较,先将Integer转换成int类型,再做值比较,所以返回的是true。
    java中还有与Integer类似的是Long,它也有一个缓存,在区间[-128,127]范围内获取缓存的值,而Long与long比较的时候先转换成long类型再做值的比较
    Double类型,它没有缓存,但是当Double与double比较的时候会先转换成double类型,再做值的比较。

  • 相关阅读:
    sql左外连接、右外连接、group by、distinct(区别)、intersect(交叉)、通配符、having
    nvarchar,varchar 区别
    链家笔试链家——找寻最小消费获取最大平均分java
    利用SpringAOP 实现 日志输出
    AOP 学习笔记
    Spring AOP中pointcut expression表达式解析
    基于@Aspect的AOP配置
    URI 中特殊字符处理
    给电脑设置视力保护色
    Spring不支持依赖注入static静态变量
  • 原文地址:https://www.cnblogs.com/miniSimple/p/12579794.html
Copyright © 2020-2023  润新知