黑马程序员技术交流社区

标题: --------一个不得不考虑的问题,小问题,大文章------ [打印本页]

作者: 吴波    时间: 2013-4-27 17:51
标题: --------一个不得不考虑的问题,小问题,大文章------
本帖最后由 吴波 于 2013-4-27 20:58 编辑

这个想不通了,难道是定义的规则?
希望能得到一个容易懂的答案

3.jpg (39.8 KB, 下载次数: 0)

3.jpg

作者: 袁梦希    时间: 2013-4-27 18:10
楼主你好:

基本数据的自动装箱和拆箱
Integer obj = 3;装箱
System.out.println(obj + 4);
小插曲:
integer i1 = 127;
integer i2 = 127;
System.out.println(i1 == i2);结果为true
当装箱的数超过127的时候呢,那么运行的结果就会
返回false。
结论:
如果这个数字在一个字节之内 -128~127之间
那么都为true,比较小的整数使用的频率很高,会反复的出现,浪费内存,对象本来不怎么改变,大家都用它用不去改变他的数据,其实这是一个设计模式,叫享元模式
fiyweight
如果很多很小的对象他们有很多相同的东西,那么就可以把它变成一个对象。
还有些不同的属性把他变成方法的参数,不同的属性称为对象的外部状态,不同的属性称为内部状态

作者: Miss小强    时间: 2013-4-27 18:15
基本数据类型包装了,八个基本数据类型都有的。。。
自己看源代码去吧,比较靠谱一点。。。
作者: 张洪慊    时间: 2013-4-27 18:20
本帖最后由 张洪慊 于 2013-4-27 18:28 编辑

帮你详细分析下:
首先要知道:
整数装箱的原理是调用了Integer.value(int)方法,看下源代码:
//JDK版本不同,底层源代码会略有差别,但是核心思想大同小异
//装箱原理
//用代码插件不会着色- -,为了看着清晰没用..
   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];//这里分配cache=new Intege[256](-128~127)
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);//每个引用指向一个Integer对象,并且角标和对象的内容相同:cache[0]->new Integer(0) cache[1]->new Integer(1)

        }

        private IntegerCache() {}
   }
public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        /*
        看这个位置如果i>=-128且i<=127
        那么他会使用IntegerCache类中中的一个对象数组
        假设两次用到100:那么会计算出(i + (-IntegerCache.low) )同一个角标,那么说明引用的是同一个Integer对象
       */
        return new Integer(i);
    }


/*
在API中有这样一句话:
   public static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。如果不需要新的 Integer 实例,则通常应优先使用该方法,而不是构造方法Integer(int i),因为该方法有可能通过缓存经常请求的值而显著提高空间和时间性能。   这是因为-128~127这些数据太常用了,因此在装箱时,让它们使用同一个对象.
*/



作者: 吴波    时间: 2013-4-27 19:04
张洪慊 发表于 2013-4-27 18:20
帮你详细分析下:
首先要知道:
整数装箱的原理是调用了Integer.value(int)方法,看下源代码:

擦,这代码看不懂了。。。太高级了。
作者: 吴波    时间: 2013-4-27 19:08
袁梦希 发表于 2013-4-27 18:10
楼主你好:

基本数据的自动装箱和拆箱

没回答到问题的本来意图,为什么会在byte里面而不是其他基本数据类型,short,int,long 等等。
不知道是我没看懂还是回答偏了?别见怪
作者: 袁梦希    时间: 2013-4-27 19:11
吴波 发表于 2013-4-27 19:08
没回答到问题的本来意图,为什么会在byte里面而不是其他基本数据类型,short,int,long 等等。
不知道是我 ...

哈哈哈   你看上面哥们的代码   多牛
作者: 吴波    时间: 2013-4-27 19:13
是啊,其实二楼和四楼的回答已经知道我问题的意图了,4楼的回答太高级了,2楼的回答偏了点
作者: 吴波    时间: 2013-4-27 19:24
袁梦希 发表于 2013-4-27 19:11
哈哈哈   你看上面哥们的代码   多牛

大哥,你对这问题还有其他的解释吗?
作者: 张洪慊    时间: 2013-4-27 21:14
吴波 发表于 2013-4-27 19:24
大哥,你对这问题还有其他的解释吗?

这个源代码,不要害怕,看了你就懂了,我们只需要抓住关键位置,这个需要锻炼.
话说我在关键地方加注释了0.0
作者: 吴波    时间: 2013-4-27 22:21
张洪慊 发表于 2013-4-27 21:14
这个源代码,不要害怕,看了你就懂了,我们只需要抓住关键位置,这个需要锻炼.
话说我在关键地方加注释了0.0 ...

谢谢!!!
作者: 吴波    时间: 2013-4-27 22:29
吴波 发表于 2013-4-27 22:21
谢谢!!!

还是不太懂,不过这个问题我理解了,谢谢你咯




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2