黑马程序员技术交流社区

标题: 拆箱和装箱问题 [打印本页]

作者: 王鑫宇    时间: 2011-8-1 13:22
标题: 拆箱和装箱问题
[code=java]package cn.itcast.day;

public class AutoBox {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub

                Integer obj = 3;                                //装箱
                System.out.println(obj + 12);        //拆箱

                Integer i1 = 1;
                Integer i2 = 1;
                System.out.println(i1==i2);
                Integer i3 = 130;
                Integer i4 = 130;
                System.out.println(i3==i4);
        }

}[/code]以前看视频没理解什么是装箱。又看了几遍,感觉是不是可以这么理解?拆箱就是新定义了一个变量,而拆箱就是使用这个变量呢?
还有,i1==i2为true   i3==i4为false 张老师的视频讲解-128到127还是没有理解,如果是以进制换算的话,换算的结果应该还是一个啊,而且变量的类型都是Integer 为什么就不同了呢。
还有
原帖由 伍仪华 于 2011-07-31 11:16 发表 String a = "abc";
String b = "abc";
System.out.println("====>"+ a==b );

请问输出结果是true还是false?

去掉"====>"结果同样是true。为什么加上就是false呢,不解
作者: 李龙    时间: 2011-8-1 13:55
拆箱就是新定义了一个变量,而拆箱就是使用这个变量呢?
我感觉这样理解没什么大问题
不过我感觉这样理解比较准确
装箱是将值类型转换为引用类型 是将值根据对象类型而被转换,相当于加了一个(Integer)
拆箱是将引用类型转换为值类型 是将对象类型根据值而被转换,

i3==i4它们被装箱为Integer对象后,会在内存中被重用,超过-128到127这个值范围后的时候每次装箱是会产生新的对象的,对象不一样了,所以在java中为false

这个要看优先级 你应该想想为什么输出结果没有"====>"字符了
实际上==前边的内容已经变成"====>abc"了,这是优先级“+” 与“==”的原因
这样你该明白了“去掉"====>"结果是true。加上就是false了”

你也应该明白为什么这被称为邪恶的面试题了吧
[ 本帖最后由 李龙 于 2011-08-01  13:57 编辑 ]
作者: 匿名    时间: 2011-8-1 13:58
[quote] 原帖由 [i]李龙[/i] 于 2011-08-01 13:55 发表 [url=http://bbs.itheima.com/redirect.jsp?goto=findpost&pid=6650&ptid=901][img]http://bbs.itheima.com/images/common/back.gif[/img][/url]

这个要看优先级 你应该想想为什么输出结果没有"====>"字符了
实际上==前边的内容已经变成"====>abc"了,这是优先级“+” 与“==”的原因
这样你该明白了“去掉"====>"结果是true。加上就是false了”

你也应该明白为什么这被称为邪恶的面试题了吧 [/quote]
这块还是没怎么明白哦
作者: 匿名    时间: 2011-8-1 14:27
"+"的优先级比“==”的高,在字符串中“+”是连接符号,只要“+”两边的数据有一个是字符串,它就会将两边的数据连接起来形成一个新字符串,在你说的问题中: ====>+a==b 这个表达式  首先将 ====>与a通过连接符“+”,连接成了====>a,然后再与b比较,此时等号的左边是"====>abc",右边是"abc",这肯定不等了,所以是false
作者: 匿名    时间: 2011-8-1 14:27
标题: 回复 藤椅 的帖子
因为"+"先于"=="执行  所以"====>"+ a==b  这条语句先执行了"====>"+ a 然后在与b进行比较

写成这样应该明白了"====>"+ a==b  就是 ("====>"+ a)==b
作者: 匿名    时间: 2011-8-1 14:50
标题: 回复 报纸 的帖子
:( 早这样说么。早这样说不就明白了。谢了哈
作者: 匿名    时间: 2011-8-1 21:37
标题: 回复 地板 的帖子
理解的过程不同,我最初认为结果为:====>true,可是运行结果为flase,字符串“====>”怎么没了呢?于是我就明白了....
作者: 匿名    时间: 2011-8-2 12:55
刚才看了好几遍  想不明白a==b,原来是少看到了一行:L
作者: 匿名    时间: 2011-8-3 00:12
自动拆装箱默认为比较常用的比较小的数值是同一个对象,所以基本的类型的整数在一个字节之内即-128~127一旦要装箱就缓冲在池里,下次如果要装箱会看池里有没有,如果有就直接从池里拿出来,就节省内存空间,默认小的整数使用率会很高,而超过了一个字节的整数就从新创建新的对象只要不在-128~127都不属于同一个对象
这个不用理,日后就自动明白了,简单一点就是Integer 和int 可以自动转换




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