装箱就是 自动将基本数据类型转换为包装器类型;
拆箱就是 自动将包装器类型转换为基本数据类型。
下表是基本数据类型对应的包装器类型:
int(4字节) Integer
byte(1字节) Byte
short(2字节) Short
long(8字节) Long
float(4字节) Float
double(8字节) Double
char(2字节) Character
boolean(未定) Boolean
package test;
public class Main {
public static void main(String[] args) {
System.out.println("常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。");
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
System.out.println("---(Byte,Short,Integer,Long,Character这5种整型的包装类也只是在对应值小于等于127并且大于等于-128时才可使用常量池(包装类,赋值)----");
/***********/
Integer i01=59; //在常量池里面,堆里面没有
int i02=59;
Integer i03=Integer.valueOf(59);//会返回IntegerCache[59 - (-128)]; 缓存池里存了-127~128
Integer i04=new Integer(59);//堆内存
System.out.println(i01==i02);
System.out.println(i02==i04);
System.out.println(i01==i04);
System.out.println(i01==i03);
System.out.println(i03==i04);
System.out.println("--valueOf 会返回IntegerCache[59 - (-128)]; 缓存池里存了-127~128-----");
/***********/
Double d1 = 100.0;
Double d2 = 100.0;
Double d3 = 200.0;
Double d4 = 200.0;
System.out.println(d1==d2);
System.out.println(d3==d4);
System.out.println(
"---Double类的valueOf方法会采用与Integer类的valueOf方法不同的实现。因为:在某个范围内的整型数值的个数是有限的,而浮点数却不是。\n" +
"\n" +
" 注意,Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。\n" +
"\n" +
" Double、Float的valueOf方法的实现是类似的。----");
/***********/
String str0=new String("abc");//此时堆中常量池中各有一份abc
String str1="abc";
String str2="abc";
String str3="a"+"b"+"c";
String str4=new String("abc");
String str5=new String("abc");
//用new String() 创建的字符串不是常量,不能在编译期就确定,当你new String("abc")时,
//其实会先在字符串常量区生成一个abc的对象,然后new String()时会在堆中分配空间,然后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str1==str4);
System.out.println(str5==str4);
System.out.println("对于equals相等的字符串,在常量池中是只有一份的(str1和str2),在堆中则有多份(str4和str5)。");
}
}