Java自动装箱与拆箱
为什么需要包装数据类型
Java是一门面向对象的语言,而基本数据类型不具备面向数据的特征,
- 当我们需要对某些数据进行表达的时候,基本数据类型无法完成,举例说明
在考试中,我们需要表示考试成绩为零分和没有参加考试的同学的状态,基本数据类型无法满足,因为基本数据类型的默认值为0,而包装数据类型可以使用null来表示没有参加考试的同学,这种功能在MySQL数据库的存储方面非常常见。
基本数据类型 0
包装数据类型 null
对应关系
java.lang.XXX
8种基本数据类型,八种包装数据类型
基本数据类型-----包装数据类型
byte ------Byte
short ------Short
int-----Integer
long----Long
float ----Float
double----Double
boolean----Boolean
char ---- Character
装箱:基本数据类型转换为包装类
Integer integer = new Integer(123);
构造方法进行装箱
Integer(int value) 构造一个新分配的 Integer 对象,该对象表示指定的 int 值。 |
---|
Integer(String s) 构造一个新分配 Integer 对象,表示 int 由指示值 String 参数。 |
拆箱:包装类转换为基本数据类型
int i = integer.intValue();
float v = integer.floatValue();
System.out.println(v);
System.out.println(i);
拆箱方法
获取最大值最小值
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
自动拆箱装箱
自动拆箱、装箱是从JDK1.5开始才有的特性
基本数据类型可以直接赋值给包装数据类型
包装数据类型也可以直接复制给基本数据类型
有了自动拆箱自动装箱,Number里面的这几个方法就用不着了
//自动装箱
Integer total = 99;
//自动拆箱
int totalprim = total;
Integer integer=123;
System.out.println(integer);
int i=integer;
System.out.println(i);
Integer total = 99;
其实这就是自动装箱的过程,上面程序在执行
Integer b=a;
的时候调用了Integer.valueOf ( int i ) 方法,`Integer b=a; 这段代码等同于:Integer b=Integer.valueOf ( a ) 。同样是new了两个对象,内存地址不同
用处
方便编程和运算
运算的时候
注意:
大于128的时候,会重新new一个对象,否则的话,就去整数常量池中拿[-128~127]
缓存池
注意问题(面试题)
为什么 Java 中“10001000”为false,而”100100“为true? 这是一个挺有意思的讨论话题。
如果你运行下面的代码:
Integer a = 1000, b = 1000;
System.out.println(a == b);//1
Integer c = 100, d = 100;
System.out.println(c == d);//2
你会得到
false
true
基本知识:我们知道,如果两个引用指向同一个对象,用 == 表示它们是相等的。如果两个引用指向不同的对象,用 == 表示它们是不相等的,即使它们的内容相同。
如果不需要新的 {@code Integer} 实例,则通常应优先使用此方法而不是构造函数 {@link Integer(int)},因为此方法可能会通过缓存频繁请求的方式产生明显更好的空间和时间性能值。
此方法将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
把这些小整数进行一个缓存,告诉取出,不新建对象
数字转换异常
不是什么东西都能转成Integer
构造一个新分配Integer
对象,表示int
由指示值String
参数。 字符串将转换为int
值,正好与基数为parseInt
方法一样。
异常
NumberFormatException
- 如果 String
不包含可解析整数。
随机数
Ramdom
int
nextInt()
返回下一个伪随机数,从这个随机数发生器的序列中均匀分布int
值。int
nextInt(int bound)
返回伪随机的,均匀分布int
值介于0(含)和指定值(不包括),从该随机数生成器的序列绘制。
Random random = new Random();
//随机产生一个整数
int i = random.nextInt();
System.out.println(i);
//产生一个0-bound范围内的随机数
int i1 = random.nextInt(101);
System.out.println(i1);
附录:八种基本数据类型
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte:
- byte 数据类型是8位、有符号的,以二进制补码表示的整数;
- 最小值是 -128(-2^7);
- 最大值是 127(2^7-1);
- 默认值是 0;
- byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
- 例子:byte a = 100,byte b = -50。
short:
- short 数据类型是 16 位、有符号的以二进制补码表示的整数
- 最小值是 -32768(-2^15);
- 最大值是 32767(2^15 - 1);
- Short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
- 默认值是 0;
- 例子:short s = 1000,short r = -20000。
int:
- int 数据类型是32位、有符号的以二进制补码表示的整数;
- 最小值是 -2,147,483,648(-2^31);
- 最大值是 2,147,483,647(2^31 - 1);
- 一般地整型变量默认为 int 类型;
- 默认值是 0 ;
- 例子:int a = 100000, int b = -200000。
long:
- long 数据类型是 64 位、有符号的以二进制补码表示的整数;
- 最小值是 -9,223,372,036,854,775,808(-2^63);
- 最大值是 9,223,372,036,854,775,807(2^63 -1);
- 这种类型主要使用在需要比较大整数的系统上;
- 默认值是 0L;
- 例子: long a = 100000L,Long b = -200000L。
"L"理论上不分大小写,但是若写成"l"容易与数字"1"混淆,不容易分辩。所以最好大写。
float:
- float 数据类型是单精度、32位、符合IEEE 754标准的浮点数;
- float 在储存大型浮点数组的时候可节省内存空间;
- 默认值是 0.0f;
- 浮点数不能用来表示精确的值,如货币;
- 例子:float f1 = 234.5f。
double:
-
double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
-
浮点数的默认类型为 double 类型;
-
double类型同样不能表示精确的值,如货币;
-
默认值是 0.0d;
-
例子:
double d1 = 7D ; double d2 = 7.; double d3 = 8.0; double d4 = 8.D; double d5 = 12.9867;
7 是一个 int 字面量,而 7D,7. 和 8.0 是 double 字面量。
boolean:
- boolean数据类型表示一位的信息;
- 只有两个取值:true 和 false;
- 这种类型只作为一种标志来记录 true/false 情况;
- 默认值是 false;
- 例子:boolean one = true。
char:
- char 类型是一个单一的 16 位 Unicode 字符;
- 最小值是 \u0000(十进制等效值为 0);
- 最大值是 \uffff(即为 65535);
- char 数据类型可以储存任何字符;
- 例子:char letter = ‘A’;。
类型默认值
下表列出了 Java 各个类型的默认值:
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | ‘u0000’ |
String (or any object) | null |