引用类型的变量只能存储对象,八种基本类型不能直接存储在引用类型中。为了Object类统一管理所有的类型,java提供了包装类的概念。
包装类:八种基本数据类型分别定义了相对应的对象类型。
基本数据类型 | byte | short | char | int | long | boolean | float | double |
包装类型 | Byte | Short | Character | Integer | Long | Boolean | Float | Double
|
包装类的作用:List等集合只能接受一个引用类型的数据,即一个对象。所以一个值类型会有一个对应的包装类型。
包装类还有一个重要的功能,就是适配器。 比如将String类型转换为一个int类型的数据。
包装类可以区分0和null;即有效数据和无效数据。
一:Number类
抽象类 Number 是 BigDecimal、BigInteger、Byte、Double、Float、Integer、Long 和 Short 类的超类。
Number 的子类必须提供将表示的数值转换为 byte、double、float、int、long 和 short 的方法。
因此,Byte、Double、Float、Integer、Long 和 Short 这六种包装实现了如下基本方法。
二:包装类的API
以Integer类为例:
①静态属性:
我们可以通过Integer.MAX_VALUE或Integer.MIN_VALUE的形式查看每种数值基本数据类型的最大值与最小值。
②如何创建一个Integer对象
1:首先可以通过构造方法
我们通常采用第一种方式构造 一个Integer类的对象。若以第二种方式,若字符串不能成功转换为 Integer类型的对象会报错。
Integer i=new Integer(11);
2:通过Integer的静态方法。
Integer i=Integer.valueOf(11);
JDK1.5中,Integer i=15;//会自动完成装箱操作,调用的就是Integer.valueOf();方法
③常用方法
将字符串转换为int数据类型的变量。
将Integer类的对象转为字符串 toString();
④Integer特有的方法
将正整数转换相对应的二进制、八进制、十六进制。
三:整数包装类的缓冲区
测试案例:
public class TestBasic {
public static void main(String[] args) {
Short s1=127;// 默认调用Short.valueOf();方法
Short s2=127;
System.out.println(s1==s2);//结果 true
Short s3=128;
Short s4=128;
System.out.println(s3==s4);//结果false
}
}
包装类默认调用 Short.valueOf();的源代码:
public static Short valueOf(short s) {
final int offset = 128;
int sAsInt = s;
if (sAsInt >= -128 && sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt + offset];
}
return new Short(s);
}
//Short包装类中的静态内部类源代码
private static class ShortCache {
private ShortCache(){}
static final Short cache[] = new Short[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Short((short)(i - 128));
}
}
明确一点: == 两边如果是基本数据类型,比较数值。
== 两边如果是引用数据类型,比较地址。
整数包装类(Integer、Byte、Short、Long)利用静态内部类对常用数值-128~127 进行缓冲 。 (内部类为外部类提供必要的功能组件) 缓冲256个包装类的对象,在上千万的高并发程序中 缓冲的开销是值得的。
因此创建整数包装类对象的数值位于 -128~127中,它们的地址必然相同。如果数值不在此区间,则执行new对象操作,地址不同。