java中的自动打包解包与原始非泛型Map接口中的get()方法

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"));
		}
也可得到正确结果。



相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页