Integer为java基本数据类型int的包装类,int a = 1; Integer b = a; 这个过程a由数值类型变成了引用类型,所以便存在很多数值类型与引用类型的使用区别,若不小心将会为程序留下一些不容易发现的隐患。
自动装箱与拆箱
自动装箱与拆箱是在jdk1.5之后出现的说法,它是java语言的一个语法糖。
比如如下代码
1 | int a = 1; |
在这个过程中第二行第三行分别发生了自动装箱与自动拆箱的过程,编译时代码行将会变为后面注释代码。
在什么过程中会发生装箱与拆箱呢,我的总结如下:
- 在赋值符号 (=) 两边分别为包装类与基本数据类型则会发生自动装箱
- 在赋值符号 (=) 两边分别为基本数据类型与包装类则会发生自动拆箱
- 在用包装类进行数值运算时会发生自动拆箱
注意事项
1 | Integer a = 1; |
执行以上代码后输出的结果是什么呢,我们不妨先向想一想在这个比较过程中是数值类型在比较还是引用类型在比较,
数值类型与引用类型 == 分别比较的是什么
现在揭晓执行后的结果
1 | Integer a = 1; |
1与2 输出结果为true是因为a与b发送的自动拆箱,这里实际上为两个基本数据类型在进行比较,所以==比较的是值是否相等
3由于a,a1均为包装类型这不会发送装箱与拆箱所以 == 比较的这是两个引用类型,比较地址是否相等,由于integet是不可变类,那么这里是不是应该输出false呢,为什么是true呢,这里需要在Integer.valueOf()中去寻找答案,我们查看源码后发现Integer内部存在缓存,也就是 -128到127是存在缓存的,所以第三条输出的是true也就正常了
4有上面一点说明所以该处为false
以下为Integer从写Object的equals方法具体实现方法
1
2
3
4
5
6public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}所以 5 6 7 8 输出结果便可以理解了
为什么需要包装类
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型。
比如,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,所以需要包装类型