Integer i1=1;
Integer i2=1;
Integer i3=128;
Integer i4=128;
System.out.println(i1==i2);
System.out.println(i3==i4);这个题的答案?主要是原因是?

解决方案 »

  1.   

    这个结果可能因JVM的实现不同而不同
    i1是一个int类型,按照你的这种写法应该是在JavaSE5以后,那么这个int会被自动装箱,生成一个包装对象,并出现在堆(heap)中,同理i2也会生成一个包装对象。
    理论上来说,这两个包装对象应该是不一样的。但是JVM会对这样的代码进行优化,使其指向同一个对象。
    据说会将1-127的数字的包装对象做成常量,忘了是在哪里看到的了。
    所以System.out.println(i1 == i2)返回 true
    而System.out.println(i3 == i4) 返回 false如果JVM没有进行优化的话,就都应该返回false。P.S.没有实际运行,结果可能和我说的不一样。
      

  2.   

    运行结果 
    true
    false
      

  3.   

    Integer 为 一部分数字做了缓存,所以integer小数字可以直接用==比较。但这种比较方式不提倡,提倡用equals方式。
      

  4.   

     integer是对象类型,int是原始类型
    java为每个原始类型(基本类型)都提供了封装类(即引用类型),引用类型和基本类型是完全不同的行为int i =1;Integer i= new Integer(1);(要把integer 当做一个类看)
      

  5.   

    true
    false
    因为:The autoboxing specification requires that boolean, byte, char <= 127, and short and
    int between –128 and 127 are wrapped into fixed objects.
      

  6.   

    比较的值必须小于128,才返回true
      

  7.   

    true 
    false
    integer按正常是在jvm内存的堆里面建立一个对象来进行引用,但是jvm会对数字进行一些优化,存在缓冲中,会储存-128-127的数字,会使他们指向同一个对象。
      

  8.   

    如果你把题目改成这样:System.out.println(Integer.valueOf(300) == Integer.valueOf(300));   
    System.out.println(Integer.valueOf(3) == Integer.valueOf(3));  结果是   false   true
    查看JDK文档的valueOf()方法
    public static Integer valueOf(int i)返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法 Integer(int),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。 
    结论:Integer内部缓存了-128到127共256个Integer对象,valueOf如果在这个范围以内,返回的是同一个对象,如果不在这个范围以内,返回一个新的对象。
      

  9.   

    Thank you everybody for this question!
    Study everyday with everyone!