登录 |  注册
首页 >  面试合集 >  Java系列面试复习笔记-更新中 >  Integer a=100,b=200比较详解

Integer a=100,b=200比较详解

题记:

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

补充:

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

分析:

       我们都知道基本类型通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址

       这里肯定你也会和我有一样的疑问为什么200的时候是false,100的时候是true,应该Integer包装对象都是比较的应该是内存的地址都应该是false才对啊!这里请看源码:

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

IntegerValueOf.png

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

@Test
    public void testInteger(){
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        System.out.println(i1==i2);
        System.out.println(i3==i4);
    }

输出结果:

true
false

这里有一点需要解释:

  • 一个Integer 与 int比较,先将Integer转换成int类型,再做值比较,所以返回的是true。

  • java中还有与Integer类似的是Long,它也有一个缓存,在区间[-128,127]范围内获取缓存的值,而Long与long比较的时候先转换成long类型再做值的比较

  • Double类型,它没有缓存,但是当Double与double比较的时候会先转换成double类型,再做值的比较

原文链接: https://www.yukx.com/hangshuo/article/details/2356.html 优科学习网Integer a=100,b=200比较详解

<<上一课程
下一课程>>
推荐文章
  • Java中的泛型基本上都是在编译器这个层次来实现的。在生成的字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为类型擦除。如在代码中定义的List和List等类型,在编译之后都会变成List。JVM看到的只是List,而由泛型附加的类型信息对
  • Segment段 ConcurrentHashMap和HashMap思路是差不多的,但是因为它支持并发操作,所以要复杂一些。整个ConcurrentHashMap由一个个Segment组成,Segment代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。注意,行文中,我很多地方用了“槽
  • HashMap根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一
  • Map类图重点关注这几个类参考资料解析(1)HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多
  • 题记:前几天面试Java基础给来了个面试题Integera=200,b=200;System.out.println(a==b);当时回答是false,后来面试官又来了一个Integera=100,b=100;System.out.println(a==b);这个回答的也是false当时面试官笑笑说
学习大纲