zoukankan      html  css  js  c++  java
  • Integer的疑惑

    1、Integer m =200; Integer n =200; System.out.println(m==n); 输出false
    Integer x =6; Integer y=6; System.out.println(x==y); 输出true

    原因:

    java 保存有8中基本类型的“池” 整型是范围是-128~127
    所以如果整数不超过127则引用指向同一“池”
    所以他们指向的是同一对象
    超过127 就不是同一对象

    原因在于,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。
    也就是说在-128到127之间的数字是同一引用地址(对于-128~127之间的数,Integer不将其分配在堆区),而其它范围就是不同的引用地址。

    2、Integer a = 1;实际上也是调用的是Integer.valueOf(1);

    3、

    Integer k = 127;  
    Integer h = new Integer(127);  
    System.out.println(k==h);  
    System.out.println(k.equals(h));  

    结果是:
    false
    true

    原因:

    对于-128~127之间的数,Integer不将其分配在堆区

    但如果new的话,有一个Integer对象肯定分配在堆区,地址不同打印一个false一个true

    以下转自http://www.importnew.com/9162.html

    有个仁兄在 StackOverflow 上发起了一个问题,是这么问的:

    “ 我被下面的代码搞晕了,为什么它们会返回不同的值?”

    System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
    System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
    System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));

    输出:

    true
    false
    true

    为什么第一个判断返回了true而第二个判断返回了false127128有什么我不知道的区别吗?(当然除了127小于128…)
    还有,为什么第三个判断返回了true
    我看了另一个相关提问的回答,但是我还是不知道它们什么时候返回true还有为什么第二个判断返回false

    回答#1:

    Integer.valueOf(String)确有一个不同寻常的行为。

    valueOf会返回一个Integer(整型)对象,当被处理的字符串在-128127(包含边界)之间时,返回的对象是预先缓存的。这就是为什么第一行的调用会返回true-127这个整型对象是被缓存的(所以两次valueOf返回的是同一个对象)——第二行的调用返回false是因为128没有被缓存,所以每次调用,都会生成一个新的整型对象,因此两个128整型对象是不同的对象。

    重要的是你要知道在上面的比较中,你实际进行比较的是integer.valueOf返回的对象引用,所以当你比较缓存外的整型对象时,相等的判断不会返回true,就算你传个valueOf的值是相等的也没用。(就像第二行中Integer.valueOf(128)==Integer.valueOf(128))。想让这个判断返回true,你需要使用equals()方法。

    parseInt()返回的不是整型对象,而是一个int型基础元素。这就是为什么最后一个判断会返回true,第三行的判断中,在判断相等时,实际比较的是128 == 128,所以它必然是相等的。

    再来说说第三种比较中的一点区别,使得它的结果与第二种比较不一样了:

    一个unboxing conversion(一种比较时的转换,把对对象的引用转换为其对应的原子类型)在第三行的比较中发生了。因为比较操作符使用了==同时等号的两边存在一个int型和一个Integer对象的引用。这样的话,等号右边返回的Integer对象被进一步转换成了int数值,才与左边进行相等判断。

    所以在转换完成后,你实际比较的是两个原子整型数值。这种转换正是你在比较两个原子类型时所期待看到的那样,所以你最终比较了128等于128

    回答#2:

    Integer类有一个静态缓存,存储了256个特殊的Integer对象——每个对象分别对应`-128 和127之间的一个值。
    有了这个概念,就可以知道上面三行代码之间的区别。

    new Integer(123);

    显示创建了一个新的Integer对象。

    Integer.parseInt("123");

    解析完字符串后返回一个int值。

    Integer.valueOf("123");

    这种情况比其他的要更复杂一些。首先进行了字符串解析,然后如果解析的值位于-128127之间,就会从静态缓存中返回对象。如果超出了这个范围,就会调用Integer()方法并将解析的值作为参数传入,得到一个新的对象。

    现在,让我们看一下问题中的3个表达式。

    Integer.valueOf("127")==Integer.valueOf("127");

    上面的表达式返回true,因为Integer的值从静态缓存中取了2次,表达式返回了对象与自己比较的结果。因为只有一个Integer对象,所以返回结果为true

    Integer.valueOf("128")==Integer.valueOf("128");

    上面的表达式返回false,因为128没有存在静态缓冲区。所以每次在判断相等时等式两边都会创建新的Integer对象。由于两个Integer对象不同,所以==只有等式两边代表同一个对象时才会返回true。因此,上面的等式返回false

    Integer.parseInt("128")==Integer.valueOf("128");

    上面的表达式比较的是左边的原始int128与右边新创建的Integer对象。但是因为intInteger之间比较是没有意义的,所以Java在进行比较前会将Integer自动拆箱,所以最后进行的是intint值之间的比较。由于128和自己相等,所以返回true

    补充说明:
    文章没有列出具体的执行环境,jdk版本信息,因此造成不一样的结果,让大家误解了.抱歉.现在说明一下:
    此文只适应于jdk7或以上版本,因为jdk6jdk7的Integer具体实现有差别,详情可查看下源代码.

  • 相关阅读:
    SQL Azure (17) SQL Azure V12
    Microsoft Azure News(5) Azure新DV2系列虚拟机上线
    Azure Redis Cache (3) 在Windows 环境下使用Redis Benchmark
    Azure PowerShell (11) 使用自定义虚拟机镜像模板,创建Azure虚拟机并绑定公网IP(VIP)和内网IP(DIP)
    Windows Azure Virtual Machine (31) 迁移Azure虚拟机
    Windows Azure Web Site (16) Azure Web Site HTTPS
    Azure China (12) 域名备案问题
    一分钟快速入门openstack
    管理员必备的Linux系统监控工具
    Keepalived+Nginx实现高可用和双主节点负载均衡
  • 原文地址:https://www.cnblogs.com/lijingran/p/8697793.html
Copyright © 2011-2022 走看看