java包装类
| 基本类型 | 大小 | 包装器类型 |
|---|---|---|
| boolean | / | boolean |
| char | 16bit | boolean |
| byte | 8bit | byte |
| short | /16bit | short |
| int | 32bit | integer |
| long | 64bit | long |
| float | 32bit | float |
| double | 64bit | double |
| void | / | void |
java 的包装类有两个主要的目的:
- java包装类将基本数据类型的值“包装”到对象中,对基本数据类型的操作变为了对对象进行操作,从而使基本值能够包含在为对象为保留的操作中。比如向collections中添加元素(泛型的操作限制加入的只能是对象,比如list = new arraylist() 的写法是错误的),或者从带对象返回值的方法中返回。
- 更加方便类型的转换,如常见的integer向字符的转换
java 在se5之后提供了自动的装箱和拆箱机制。基本数据类型可以和与其对应的包装类之间自动进行转换
如:
|
1
2
|
integer i = 10;
int index = i;
|
装箱就是自动将基本数据类型转换为包装器类型
拆箱就是自动将包装器类型装换为基本数据类型
在装箱的时候自动调用的是integer的valueof(int)方法。而在拆箱的时候自动调用的是integer的intvalue方法。
其他的也类似,比如double、character,不相信的朋友可以自己手动尝试一下。
装箱过程是通过调用包装器的valueof方法实现的,而拆箱过程是通过调用包装器的xxxvalue方法实现的。(xxx代表对应的基本数据类型)。
面试问题
下面这段代码的输出结果是什么?
|
1
2
3
4
5
6
7
8
9
10
11
|
public class main {
public static void main(string[] args) {
integer i1 = 100;
integer i2 = 100;
integer i3 = 200;
integer i4 = 200;
system.out.println(i1==i2);
system.out.println(i3==i4);
}
}
|
注意 ==和equals的区别:
|类型| == |equals
|–|–|–|
| 基本数据类型 | 值 | 不可用
| 包装类 | 地址 | 内容
输出的结果为:
true
false
为什么会出现这样的结果?输出结果表明 i1 和 i2 指向的是同一个对象,而 i3 和 i4 指向的是不同的对象。此时只需一看源码便知究竟,下面这段代码是integer的valueof方法的具体实现:
|
1
2
3
4
5
6
|
public static integer valueof(int i) {
if(i >= -128 && i <= integercache.high)
return integercache.cache[i + 128];
else
return new integer(i);
}
|
从这2段代码可以看出,在通过valueof方法创建integer对象的时候,如果数值在 [-128,127] 之间,便返回指向integercache.cache中已经存在的对象的引用;否则创建一个新的integer对象。
上面的代码中 i1 和 i2 的数值为100,因此会直接从cache中取已经存在的对象,所以 i1 和 i2 指向的是同一个对象,而 i3 和 i4 则是分别指向不同的对象。
下面这段代码的输出结果是什么?
|
1
2
3
4
5
6
7
8
9
10
11
|
public class main {
public static void main(string[] args) {
double i1 = 100.0;
double i2 = 100.0;
double i3 = 200.0;
double i4 = 200.0;
system.out.println(i1==i2);
system.out.println(i3==i4);
}
}
|
也许有的朋友会认为跟上面一道题目的输出结果相同,但是事实上却不是。实际输出结果为:
false
false
至于具体为什么,读者可以去查看double类的valueof的实现。
在这里只解释一下为什么double类的valueof方法会采用与integer类的valueof方法不同的实现。很简单:在某个范围内的整型数值的个数是有限的,而浮点数却不是。
注意,integer、short、byte、character、long这几个类的valueof方法的实现是类似的,double、float的valueof方法的实现是类似的
以上所述是小编给大家介绍的java包装类及自动装箱拆箱详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对快网idc网站的支持!
原文链接:https://blog.csdn.net/qq_31749835/article/details/88662590
相关文章
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10
- 个人网站服务器域名解析设置指南:从购买到绑定全流程 2025-06-10
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
-
2025-05-29 35
-
2025-05-25 77
-
2025-06-04 90
-
2025-05-27 78
-
2025-05-25 40

