public class TestDengHao {
         public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.println(a == b);
System.out.println(c == d);
}
}
大家看一下这道题,这些100,200在内存中是怎么分配的。有种说法是搞c/c++的话很注重内存分析,搞java的话不用太注重。我不是很赞同,大家的看法是什么啊?

解决方案 »

  1.   

    内存分析,咱不太懂,源代码还能看一点。
    "="重载了valueof方法:    public static Integer valueOf(int i) {
            if(i >= -128 && i <= IntegerCache.high)
                return IntegerCache.cache[i + 128];
            else
                return new Integer(i);
        }
      

  2.   

    那看看这个,这是Integer类内的一个静态内部类:
        private static class IntegerCache {
            static final int high;
            static final Integer cache[];        static {
                final int low = -128;            // high value may be configured by property
                int h = 127;
                if (integerCacheHighPropValue != null) {
                    // Use Long.decode here to avoid invoking methods that
                    // require Integer's autoboxing cache to be initialized
                    int i = Long.decode(integerCacheHighPropValue).intValue();
                    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() {}
        }
      

  3.   

    Integer有自动缓存的机制,这点有点类似String常量池。if(i >= -128 &amp;&amp; i <= IntegerCache.high)
    return IntegerCache.cache[i + 128]  也就是说当数在-128 到 127之间的时候 返回的是cache数组,而这个数组应该是static,所有有多个Integer,它们返回的数组对象只有一个,也就是说地址是相同的,所以System.out.println(a == b);应该是true.相反当你的数是200的时候,也就是说大于127了,那么将会在堆中开辟新的Integer空间 所以System.out.println(c == d); 为false。  JVM这样做就是为了当有大量数值小于127大于-128的时候,可以不用创建空间了,减少消耗。
      

  4.   


    据我所知,内存好像被分成四个区,heap,stack,data segment,还有一个什么来着,都分别放些什么啊?4楼你的意思是100不是放在堆内存还是怎么啊?
    求解释,谢谢!
      

  5.   

    另外针对楼主  有种说法是搞c/c++的话很注重内存分析,搞java的话不用太注重。我不是很赞同,大家的看法是什么啊?我觉得还是要看你用JAVA做什么。大部分人用JAVA基本上做做网页,做做XXX系统,很少跟内存打交道。写底层代码基本上用C或者汇编。原先用汇编的时候,想不跟内存打交道都不行。但是JAVA作为一门高级语言,一门面向对象语言,应该不像C那样面向底层编写代码,况且C里面有指针,说实在的它也必须要为内存分配动动脑子。而JAVA没有指针的概念,对于程序员来讲,应该是更加方便了。当然有些人特别喜欢研究内存问题,挺好的,因为欧洲的潮流是越底层越接近机器硬件,越有前途。
      

  6.   

    Code segment 代码区,编译后的代码Data segment 用来放静态变量和常量Stack 叫栈:用来存放局部变量Heap叫堆:用来动态生成内存的如成员变量 。我们微机接口与组成原理讲的。   
    100是放在cache数组里的,而这个数组是放在堆中的
      

  7.   

    当值再-128~127之间时,被装箱成Integer对象后,会存在内存里被重用,这时用"=="比较的时候,a和b是参考到同一个对象上的.Integer a = 100时,编译器将其转换为:Integer a = Integer.valueOf(100);
        public static Integer valueOf(int i) {
            if(i >= -128 && i <= IntegerCache.high)
                return IntegerCache.cache[i + 128];
            else
                return new Integer(i);
        }    /**
         * The value of the <code>Integer</code>.
         *
         * @serial
         */当超过范围时,"=="比较的是两个对象,所以结果是FALSE.要改成c.equals(d)
      

  8.   

    常量都放在常量池  看下 深入JAVA 虚拟机 
      

  9.   


    我现在看完了基础语法啦,是不是应该搞个小项目做做,还是要学点其他的什么,不知道swt要不要学啊?
      

  10.   

    前些日子刚干完SWT,看你有没有兴趣了呵呵
      

  11.   


    方法放在code segment?