java面试经常会遇到的一些问题分析

以下为参考其他博客后自己对相关问题的一些理解:
一、int和Integer相关试题
1、int a =100,int b=100,Integer c = 100,Integer d = new Integer(100)通过”==”做比较各种返回值。
解析:此类题需要考虑java内部针对一些特殊值做比较时会出现特殊处理的方式。在java内部维护这一个静态的数组,其取值范围为[-128,127]。当我们第一次初始化Integer时,java内部会同时添加[-128,127]这区间的所有值的缓存,并存放在静态数组中。当再次初始化该区间的值时,实际上是直接调用valueOf()方法获取缓存中已经创建好的数值。所以当使用”==”进行比较时,返回值肯定为true。如果初始化值超过缓存区间,则从新new一个新的对象返回。至于int 和Integer比较时,实际比较的都是最终的值。但有种情况需要注意,当两个Integer包装类进行比较时,如果取值范围在静态数组以外,比较的是他们的地址,所以即便是两个数值相等的Integer对象,他们的返回也是false。
*Long和long也是同样的道理。

二、String相关
1、“==”和“equals”区别。
“==”一般比较的是内存地址,而“equals”比较的是字面值。
2、String s1=”abc”,String s2=new String(“abc”),String s3 = “a”,String s4=”bc”,String s5=s3+s4,这类试题的比较。
解决这类问题需要考虑到String缓冲池。当是用String s1=”abc”初始化字符串时,首先会去缓冲池中查找是否存在有”abc”实例,如果缓冲池中不存在,则创建一个该对象缓存并返回其地址,如果存在则直接返回引用地址。String s2=new String(“abc”)同样会经历上述过程,同时还会重新创建了一个String对象存放在堆中,通过s2指向其在堆中的内存地址。所以,在这类比较题中,字符串是否相等主要考虑该字符串是取自于缓冲池还是取自于指向堆中的内存地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值