集合类中泛型Integer与int的联系
先说结论:在集合类中,内置方法进行比较运算(如contains()、get())的时候,Integer等同于int。
集合类的泛型不允许使用基本数据类型,因此当我们需要使用int类型时往往会用Integer的泛型代替。这样,我们即可以向集合中添加Integer类型又可以添加int类型。我们知道,new不同Integer对象,以及-128~127范围外的Integer.valueOf()创建的对象都是不相等的,但在集合类中他们却相等。显然我们有必要通过源码了解一下集合类中对于这两种类型的处理。
事实上,集合类对于大小的比较,采用的是hash()、equals(),而它们比较的都是Integer对象的value值,它是一个int 类型。
new 一个Integer对象
equals方法
以上可以看出Integer的equals方法就是对值的比较。下面我们来看看集合类。
1.LinkedList类contains方法的中调用方法(该方法返回-1则contains判断为false)
2.HashSet集合类的contains方法的一个调用
可以看到此处需要比较hashcode值,那我们来看一下Integer类的hashcode值是如何计算的
直接返回了value值,这样我们就完全可以把它看作int
再来看下完整的获取节点(Hash表中元素用节点存储)的方法
使用的是hashcode值和equals方法,前面我们知道Integer类的hashcode值和equals方法都使用value值得到,显然它们是相等的。
HashMap的contains方法和get方法同HashSet,TreeMap的contains的这两个方法回用到compareTo,Integer方法的compareTo方法同样用value值进行比较。
TreeMap中get方法调用方法:
综上:Integer类在集合中的操作都是用其value值进行运算,因此在集合中,可以把int和Integer等同看待。