日期:2014-05-20 浏览次数:21211 次
public class Test {
public static void main(String[] args) {
Bean cc = new Bean();
HashMap map = new HashMap();
cc.set(1);
map.put("a", cc); // 对象啊,什么值,Map的所谓的key-value 其实都必须是对象。
cc.set(2); // 你修改了 cc 对象的c值,
map.put("b", cc); // 你把 cc 再次存到了 b 的key 里面,记得,cc 只有一个,只不过有2个信封都存了他的地址
cc.set(3); // 再次修改了cc的 c值
map.put("c", cc); // 你又增加了一个信封,不过里面保存的依然是相同的地址
System.out.println(((Bean) map.get("a")).get());// Map 里面存的是对象,不是Bean, 所以拿出来时必须转换。 因为存的都是cc的地址,所以拿到的也只有cc了,所以cc的c值为最后一次赋值的 3
}
}
------解决方案--------------------
map当中可以放object类型的,不管cc中有无值,cc中应该有值。map得到的是object类型的对象,object没有get()方法,所以要强制转换。因为三次put的对象均为cc是同一个对象,如果改成在cc.set(3)前加cc=new Bean()则输出应为2
------解决方案--------------------
首先你必须了解Map的所谓的key-value 其实都必须是对象.你的结果为什么是3,是因为后面你为对象赋的值覆盖了前面的值了,你提取的值总是最后一个赋的值,如果你想取的值不一样,就应该照下面的做.这样你就能取到a,b,c 的值了.
import java.util.*;
class Bean
{
int c = 0;
void set (int x) {
c=x;
}
int get() {
return c;
}
}
public class Test
{
public static void main (String[] args) {
Bean cc ;
HashMap map = new HashMap();
cc=new Bean();
cc.set(1);
map.put("a",cc);
cc=new Bean();
cc.set(2);
map.put("b",cc);
cc=new Bean();
cc.set(3);
map.put("c",cc);
System.out.println(((Bean)map.get("a")).get());
}
}
------解决方案--------------------
取出的时候默认返回的是object,需要向下转型才能使用bean的方法
c是引用,几次set都是修改的同一个对象,而添加到map里的都是同一个对象
------解决方案--------------------
放进去的只是引用,区别引用和引用指向的对象很重要。
关于类型转换,向上或者向下,需要知道的一点是,这些是受编译器检查的。
((Bean)map.get("a")).get(); 编译期间只要转换后的类型中确实有被操作的方法,例如:Bean类中有get()方法。
编译器是不会管你把芙蓉姐姐转成李嘉欣,还是把周杰伦转换成李宇春的。
只有在运行时,JVM发现如果不能转换(例如:周杰伦转换成李宇春),才会抛出ClassCastException异常。
另外,也可以考虑使用泛型机制。