要了解128陷阱,首先要知道3个基本概念,包装器类型、自动装箱、自动拆箱。
每个基本类型都有对应的包装器类型,包装器类型。
自动装箱是指自动将基本数据类型转换为包装器类型。
自动拆箱是指自动将包装器类型转换为基本数据类型。
下面举个例子
结果是true,true?No,结果如下
这是因为当值在[-128, 127] 之间时,valueOf 方法不会创建新的Integer对象,而是从缓存中获取,这样一来,值相同的int,计算所得的下标是一样的,自然会获取到同一个Integer对象。而超出这个范围就不会从缓存中获取了,每次都new一个新的Integer对象,两个不同的对象的内存地址不同,用==自然会得到false。
下面是valueof的源码
在源码中我们可以发现如果i >= IntegerCache.low && i <= IntegerCache.high时返回一个已存在于指定数组中的的Integer对象,否则返回一个新对象。
因为==比较的是对象的地址,当赋给a或b的值不在这个范围内时比较是两个具有相同值的不同对象,所以结果会不相等。
简单来说,在Integet的valueOf()方当中,在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。而不在这个区间的数,需要新开辟一个内存空间,所以不相等。