<JDK1.5新特性>:3.自动装箱/拆箱(Autoboxing/unboxing)-
1.自动装箱/拆箱大大方便了基本类型数据和它们所对应的包装类的使用; 五十七-50:00
2.自动装箱/拆箱是相对于8个原生的数据类型以及它们的包装类而言的;
3.Java中8个原生数据类型比较特殊,因为只有他们不是Class,不会自动继承java.lang.Object类,其余的全部是Class;
4.自动装箱/拆箱操作简化了原生数据类型与对应的包装类之间的转换过程;
5.自动装箱/拆箱完成了原生数据类型和对应包装类之间的自动转换过程。
6.该特点的一大用处就是简化对集合中元素的操作,使得我们向集合中放置对象和从集合中取出内容的时候不用手动的在原生数据和对象数据之间进行转换,取而代之的是直接放置数据、直接取出数据、直接进行四则运算,编译器会自动的针对当前的操作进行相应的自动装箱/拆箱转换。
八个原生数据类型分别为:
byte,short,int,long,float,double,char,boolean
java中不存在有符号类型
对应的包装类型分别为:
Byte,Short,Integer,Long,Float,Double,Character,Boolean
六十-29:00
自动装箱:基本类型自动转换为其包装类(int >> Integer)
自动拆箱:包装类自动转换为基本类型(Integer >> int)
例1:
package cn.edu.bupt.genericinterface;
import java.util.ArrayList;
import java.util.Collection;
public class BoxTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 9;
Collection<Integer> col = new ArrayList<Integer>(); //注意:这个集合的类型参数是Integer类型,也就是说只能接受Integer类型的对象
//不使用自动装箱拆箱的方式
col.add(new Integer(2));
//以下是用自动装箱拆箱方式加入到集合类中
col.add(3); //将int类型的3转换为Integer类型并放入到集合类中
col.add(a + 3); //先进行数学计算,然后将计算结果"自动装箱"为Integer类型放入集合类中
for(int number : col) { //将col中加入的Integer类型数据"自动拆箱"转换为int类型,并进行输出
System.out.println(number);
}
}
}
例2:(需求:读取输入参数,统计重复的参数的个数)
方法1:
package cn.edu.bupt;
import java.util.HashMap;
import java.util.Set;
public class ReadParameterString {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(int i=0; i<args.length; i++) {
if(map.get(args[i]) == null) {
map.put(args[i], 1); //整数1被自动装箱为Integer类型,并放入map中
}
else {
int numbers = map.get(args[i]); //相应的value(为Integer类型的值)被自动拆箱
map.put(args[i], ++numbers); //++numbers后int类型的numbers又被自动装箱为Integer值放入map中
}
}
Set<String> set = map.keySet();
for(String key : set) {
int value = map.get(key); //通过key获取的Integer类型的value值被自动拆箱为int类型值
System.out.println(key + " = " + value);
}
}
}
方法2:
package cn.edu.bupt;
import java.util.HashMap;
import java.util.Set;
public class ReadParameterString {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
HashMap<String, Integer> map = new HashMap<String, Integer>();
for(String param : args) {
map.put(param, null==map.get(param) ? 1 : map.get(param)+1); //1被自动装箱,第二个map.get(param)被自动拆箱,map.get(param)+1被自动装箱
}
Set<String> set = map.keySet();
for(String key : set) {
int value = map.get(key); //通过key获取的Integer类型的value值被自动拆箱为dint类型值
System.out.println(key + " = " + value);
}
}
}
例3:
public class Hello {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer i1 = 200; //200被自动装箱
Integer i2 = 200; //200被自动装箱
if(i1 == i2) { //Integer实例对象的地址相比较,而不是value值相比较
System.out.println("i1 == i2");
}
else {
System.out.println("i1 != i2");
}
}
}
注:改片段的输出结果是 "i1 != i2",但是当把i1与i2的值换成是-128~+127之间时,输出结果是"i1 == i2"
原因是Integer类维护一个缓存区,它会缓存介于-128~127之间的整数对象(Integer类型),(具体见Integer源代码Line.180)
这在自动装箱的过程中调用了Integer.valueOf(int i)方法,但是当你不使用自动装箱或valueOf(int i),而是
使用new Integer(int i)来构造Integer类型的对象的时候,不管传递进去的是多大的整数,都将会被当做两个
对象来处理,而不是指向同一个对象的两个指针变量。
其余七个原生简单数据类型的自动装箱/拆箱方式同Integer类型。
浙公网安备 33010602011771号