搞清楚一道关于Integer的面试题
作者:互联网
请看题1:
{ ([] ) { ; ; ; ; ..( ); ..( ); } }
上面这道题输出:
false true
因为Java的自动拆箱和自动封箱,那么
Integer a = 888;
就是相当于
Integer a = new Integer(888);
自然上面的变量a和b都是各自指向不同的对象引用地址。那么答案就肯定是false。
那为什么c===d就是指向同一个对象呢?
再来看看,Integer中部分源码
( ) { ( . .) .[ (.)]; (); } { ; ; []; { ; [( ) ]; ; ( ; .; ) [] (); } () {} }
面试题2:
{ ([] ) { (); (); ..(); } ( ){ (); } }
上面应该输出多少呢?
面试题3:
{ ([] ) { (); ; ..(); } }
这里又将输出多少呢?
继续看源码:
{ ; ( ) { . ; } }
面试题3中的a=99相当于a=new Integer(99);重新给把一个新的对象引用地址给了a,所以a变了,最后输出是99。
那么面试题2呢?
我们都知道在Java中,Java 只有值传递,只不过值传递分为:内存中数值的值传递以及内存地址数值的值传递,传递一个Integer变量参数进去,实际上是构建了一个副本,通过这个副本我们只能去修改原来Integer变量的非final成员变量(假如有的话,也可以是其他类型),上面也说了,如果去修改Integer类型的final变量,那么是会新new一个Integer变量,去覆盖这个变量副本,所以原来的Integer a变量还是原来的,仅仅是test这个方法里的副本变量变了,这么理解就清楚了。所以面试题2 输出88。
标签:面试题,副本,搞清楚,变量,..,Java,Integer 来源: https://blog.51cto.com/10983206/2563569