Java自动装箱与拆箱
2024-10-21 03:33:43
装箱就是自动将基本数据类型转换为包装器类型(int-->Integer)。调用方法:Integer的 valueOf(int) 方法
拆箱就是自动将包装器类型转换为基本数据类型(Integer-->int)。调用方法:Integer的 intValue方法
在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:
Integer i = new Integer(10);
而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要 这样就可以了:
Integer i = 10;
以下代码会输出什么?
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);
}
}
结果:
true
false
为什么会出现这样的结果?输出结果表明i1和i2指向的是同一个对象,而i3和i4指向的是不同的对 象。此时只需一看源码便知究竟,下面这段代码是Integer的valueOf方法的具体实现:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
其中IntegerCache类的实现为:
1 private static class IntegerCache {
2 static final int high;
3 static final Integer cache[];
4 static {
5 final int low = -128;
6 // high value may be configured by property
7 int h = 127;
8 if (integerCacheHighPropValue != null) {
9 // Use Long.decode here to avoid invoking methods that
10 // require Integer's autoboxing cache to be initialized
11 int i = Long.decode(integerCacheHighPropValue).intValue();
12 i = Math.max(i, 127);
13 // Maximum array size is Integer.MAX_VALUE
14 h = Math.min(i, Integer.MAX_VALUE - -low);
15 }
16 high = h;
17 cache = new Integer[(high - low) + 1];
18 int j = low;
19 for(int k = 0; k < cache.length; k++)
20 cache[k] = new Integer(j++);
21 }
22 private IntegerCache() {}
23 }
从这两段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间, 便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。 上面的代码中i1和i2的数值为100,因此会直接从cache中取已经存在的对象,所以i1和i2指向的是 同一个对象,而i3和i4则是分别指向不同的对象。
以下代码输出什么
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
原因: 在某个范围内的整型数值的个数是有限的,而浮点数却不是。
最新文章
- svn ignore
- DEV GridControl双击行事件
- mysql规范
- C#变量与数据类型
- hadoop(四): 本地 hbase 集群配置 Azure Blob Storage
- Winform之ListView
- 车牌识别LPR(一)-- 研究背景
- 关于typedef int(*lpAddFun)(int, int)
- iOS7 文本转语音 AVSpeechSynthesizer
- UVA11396-Claw Decomposition(二分图判定)
- PuTsangTo-单撸游戏开发03 碰撞与跳跃瑕疵版
- JAVA入门[11]-jsp几点基础语法
- 微信小程序笔记
- HDU 5288 OO&rsquo;s Sequence
- 【splunk】数据输入-文件目录 导入失败
- hdu 1698 Just a Hook 【线段树+lazy】
- [转]thinkphp在iis下的rewrite伪静态的配置方法
- Database Vault Administrator的使用
- php API接口入门
- 第2季:从官方例程深度学习海思SDK及API
热门文章
- 关于网页实现串口或者TCP通讯的说明
- 微信支付v3接口的 官方 Java SDK
- Codeforces Round #811 (Div. 3)D. Color with Occurrences
- ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
- 1.nginx学习
- 微信小程序经纬度转化为具体位置(逆地址解析)
- MySQL InnooDB引擎之并发事务问题以及隔离级别的作用和区别
- civil3d安装教程2022序列号和密钥
- 4.mysql-进阶
- .NET 6使用ImageSharp给图片添加水印