请看以下代码: Integer x = 3;
Integer y = 3;
System.out.println(x == y);第一、请问以上代码的打印结果为什么是true?
再看以下代码: Integer x = 3;
Integer y = new Integer(3);
System.out.println(x == y);第一、请问以上代码的打印结果为什么是false?请从内存的角度来解释问题,谢谢大家!

解决方案 »

  1.   

    这涉及Interger的享元模式 Interger在一定范围内的数据(多大范围我忘记了)会进行享元,所谓享元就是你第一次Integer x = 3;Integer会去内存中找是否存在这个对象,如果存在则直接用存在的那个对象,如果不存在则就new一个对象。当你第一次new的时候发现没有则就new出来一个对象,第二次new的时候发现内存中有了一个这个对象则直接把引用指向了那个对象。Integer x = 3; Integer y = new Integer(3); System.out.println(x == y); 这个为false的原因是你第二次不管内存中有没有都自己new出来了一个其实这个的理解就是String一样,难点主要在Interger的享元模式(一定范围内)..
      

  2.   

    正好今天刚看到
    Integer 内部会缓存[-128,127]的对象,这个区间内如果不new就会使用缓存对象,可以直接用==比较;超出这个区间,或者使用new时,则必须用equals
      

  3.   

    http://www.ticmy.com/?p=110
      

  4.   

    好像是Integer缓存了[-128,127]之间的Integer对象
      

  5.   

    请看源码缓存:
        private static class IntegerCache {
            static final int low = -128;
            static final int high;
            static final Integer cache[];        static {
                // high value may be configured by property
                int h = 127;
                String integerCacheHighPropValue =
                    sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
                if (integerCacheHighPropValue != null) {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low));
                }
                high = h;            cache = new Integer[(high - low) + 1];
                int j = low;
                for(int k = 0; k < cache.length; k++)
                    cache[k] = new Integer(j++);
            }        private IntegerCache() {}
        }
    如果不适用构造器,直接赋值,会有缓存现象,范围在[-128,127]
      

  6.   

    Quote: 引用 6 楼 yhlssdone 的回复:

    Quote:

    +1
      

  7.   

    使用new 自然会分配内存,interger 是封装类
      

  8.   

    new Integer(3);会在堆中创建一个内存,而Integer i = 3 ; Integer x = 3 ;都只是在栈内存中创建了内存。