1、包装器类
所有的基本类型都有一个与之对应的类。例如Integer类对应的基本类型int。这些类成为包装器类。比如还有Long\Float\Double\Short\Byte\Charactor\Void\Boolean等类。
2、基本类型转换为对象
有时,需要将int这样的类型转换成对象。假设定义一个整形数组列表,而尖括号中的类型参数不允许是基本类型,如不允许写成ArrayList<Integer>。这里就必须用到Integer对象包装类。我们可以声明一个Integer对象的数组列表,添加元素并取出复制给基本类型常量i:
Array<Integer>list = new ArrayList<>();
list.add(new Integer(3));//在数组列表中插入值为3的Integer类对象
int i = list.get(0).intValue();//get()返回Integet对象的值,intvValue将其转成int形式。
3、自动打包与解包
Java SE 5.0添加了自动打包与解包机制,系统可自动的把基础数据类型(如int)转换成包装器类对象(如Integer);并且可自动把包装器类对象(如Integer)转换成基础数据类型(如int)。
上面的程序可改成:
Array<Integer>list = new ArrayList<>();
list.add(3);
int i = list.get(0);
4、HashMap类中的get()方法
模仿上述数组列表的形式,构造一个HashMap,添加两个int元素并取出第二个赋值给基本常量:
<pre name="code" class="java">Map d = new HashMap();
d.put("one",Integer.valueOf(1));
d.put("two",2);
if(d.containsKey("two"))//若存在键值two
{
int t = d.get("two");
System.out.println(t);
}
编译,这里得到一个错误:不兼容的类型,不可将Object类型转换成Int 类型。
明明返回的是values的类型,怎么成了Object类的了。
查看d.get()到底是哪个类的对象:
System.out.println(d.get("two").getClass().getName());
发现结果为:
java.lang.Integer
原来这里没有使用泛型程序设计,d.get()返回的是Object引用的Integer类对象。
所以这里应该进行强制类型转换:
Map d = new HashMap();
d.put("one",Integer.valueOf(1));
d.put("two",2);
if(d.containsKey("two"))//若存在键值two
{
int t = (Integer)d.get("two");//强制类型转换
System.out.println(t);
}
这样得到正确运行结果。
此外也可直接输出:
Map d = new HashMap();
d.put("one",Integer.valueOf(1));
d.put("two",2);
if(d.containsKey("two"))//若存在键值two
{
System.out.println(d.get("two"));
}
也可得到正确结果。