日期:2014-05-20 浏览次数:20826 次
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异常。
另外,也可以考虑使用泛型机制。