java自动装箱和拆箱的问题?

int a = 200;
Integer b = 200;
System.out.println(a == b);

结果输出是true,我是用javap -v反编译了一下看了一下字节码,我发现好像这里是对int a做的装箱处理,这样对于引用类型,==就应该比较的是地址,200也不再缓冲池内,那为什么会返回true呢?

阅读 2k
2 个回答
✓ 已被采纳

因为a是原生类型,所以 ==操作符 会触发一次类型转换操作,即相当于做了一次「拆箱unboxing」。
最终是 数值比较,所以是true。在反编译后的字节码中表现为以下语句:

不是 a 被装箱,而是 b 被拆箱

== 的一边是基本类型,另一边的包装类会被拆箱

原代码会被编译为

int a = 200;
Integer b = Integer.valueOf(200);
System.out.println(a == b.intValue());

相关规范:https://docs.oracle.com/javas...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题