zoukankan      html  css  js  c++  java
  • 关于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类型,再做值的比较。

  • 相关阅读:
    man LVCREATE
    Pyhton---基础---递归
    Python---基础---循环,函数
    Python---基础---dict_tuple_set
    Python---基础---dict和set2
    安卓网络编程学习(1)——java原生网络编程(1)
    使用python爬取B站弹幕和三连
    maven项目整合工具学习
    读阿里巴巴泰山版《java开发手册》总结(2)
    第十三周学习进度
  • 原文地址:https://www.cnblogs.com/miniSimple/p/12579794.html
Copyright © 2011-2022 走看看