为什么需要有这个包装类
1.万物皆对象,把基本类型也弄成对象。这样就能有自己的属性和方法。
2.说过JAVA是面相对象的语言, 其很多设计都是针对对象来的。比如HashMap的设计, 在插入时, 需要先调用插入key的Object::equals, 但是基本数据类型是没有行为的, 意味着基本数据类型无法作为HashMap的key; 如果没有封装类, 我们就无法实现用数值类型作为key了;
3.可为null,因此可用于pojo,因为数据库里读出来可能是null
4.可用于泛型,这也是List<Integer>的原因。因为泛型在编译时会进行类型擦除,最后只保留原始类型,而原始类型只能是 Object 类及其子类——基本类型是个特例。
每个基本类型都有对应的包装类型:
自动装箱/拆箱
本来从基本类型到包装类都需要自己手动装箱拆箱
Integer nums=Integer.valueOf(2);//装箱 int nums2=nums.intValue();//拆箱
后来直接可以自动拆箱装箱
Integer nums=2; int nums2=nums;
Integer的源码
直接有个属性就是int型的value
自动装箱时有缓存机制:如果数字在 -128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象。直接在缓存这个Integer[]中。
注意,自动装箱调用的是valueof,而不是new Integer();
等于和equals
==对于引用对象来说直接比较两个引用是否指向堆内存里的同一个地址(同一个对象)。
equals是一个方法,一般来说比较数据。例如Integer的值,String的值
于是有一些题目:
两个的值相同,但不是一个对象
在缓存内,自动装箱调valueof方法,所以同一个对象