包装类是Java为每种基本数据类型(int,short,long等)提供的对象表示形式,它们将基本数据类型"包装"成对象,使得基本类型也能以对象的形式使用。由于Java是面向对象的语言,很多API和容器类只能操作对象,为了接近这个问题,Java便提供了包装类,其包含了各种实用方法(如类型转换、进制转换等),也接近了基本类型不能为null的问题。而在int的包装类Integer中存在一个名为128陷阱的问题,其具体情况如下:
其输出结果如下:
可以看到,在-128到127中间,Integer是可以通过==进行正确的比较,而一旦超过这个区间,就会发生错误,这就是所谓的128陷阱,即Integer通过==只能在-128到127之间进行比较,超过这个就不能进行比较。而这是因为Integer有一个缓存:
其中的low和high为其缓存的上下限,可以看到,high==h==127,low==-128,说明这个缓存可以缓存在-128到127里的int,如果使用在在这个区间里的数字创建Integer类,实际上是从这个缓存里取出对应的数字的Integer,而如果不在这个区间的数值创建Integer,则是new了一个新的Integer,前者不管创建多少个,其指向的地址都是一样的,而后者每一个都是new了一个新的Integer,地址自然也都不相同,使用==自然也就比较不出来,通常为了解决这个问题,我们应该使用equals()方法进行比较,如下图