包装类封装了基本数据类型
//基本数据类型和他们各自包装类的对应关系
byte -- java.lang.Byte
short -- java.lang.Short
int -- java.lang.Integer
long -- java.lang.Long
float -- java.lang.Float
double -- java.lang.Double
char -- java.lang.Character
boolean -- java.lang.Boolean
转换关系:
// int --> Integer 两种方式
Integer a = new Integer(22);
Integer b = Integer.valueOf(22);
// Integer --> int
int c = a.intValue();
// 把字符串转换为int(字符串须为纯数字)
int d = Integer.parseInt("123");
//把字符串转换为double(字符串须为纯数字)
double d1 = Double.parseDouble("12.3");
// int值转换为二进制的字符串
String s1 = Integer.toBinaryString(10);
// int值转换为16进制的字符串
String s2 = Integer.toHexString(30);
// int值转换为8进制的字符串
String s3 = Integer.toOctalString(10);
// String转Integer,参数字符串必须为纯数字
Integer i1 = Integer.valueOf("123");
Integer i2 = new Integer("12313");
自动装箱、自动拆箱(以Integer和int为例)
java1.5版本后,引入了自动装箱、自动拆箱。自动装箱指的是把基本数据类型转换为对应的包装类,自动拆箱指把包装类自动转换为基本数据类型,都是在编译时完成的。
//自动装箱,
//编译完后就等于是 : Integer i2 = Integer.valueOf(222);
Integer i1 = 222;
Integer i2 = new Integer(28);
int i3 = i2; //自动拆箱
在1.5之前,装箱和拆箱是这样的
Integer i1 = new Integer(223); //装
Integer.valueOf(2222);//装
Integer i2 = new Integer(28);
int i3 = i2.intValue(); //拆箱
Integer的装箱底层原理:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
看源码,我们可以这么理解,在内存中,有一个Integer[] 数组,有 256个对象,对象中的int值分别为 -128,-127…126,127,分别保存在下标是0~ 255的空间中。如果我们传入的值在 -128~127之间,就直接去这个缓存数组中找到对应的对象,不用再重新创建Integer对象,如果值不在这个范围,就会通过new关键字在堆内存创建一个对象。
Integer i1 = 123;
Integer i2 = 123;
//true , i1和i2两个引用都保存同一块内存地址
//123在-127~128中,缓冲区就有数据,i1和i2两个引用都指向这个对象
System.out.println(i1 == i2);
// Integer i3 = 128;
// 等于 Integer i3 = Integer.valueOf(128);
//但是128不在-128~127范围内,那麽这个对象就不会被保存在常量池中,而是保存在了堆内存
//所以i3和i4指向的两个对象,不在一个地址
//使用 == 判断,也就是false
Integer i3 = 128;
Integer i4 = 128;
System.out.println(i3 == i4);//false