日期:2014-05-20  浏览次数:20826 次

请教:关于 map
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 = new Bean();
HashMap map = new HashMap();
cc.set(1);
map.put("a",cc); //这里的“值”,为什么可以用cc(对象),cc中有值吗?
cc.set(2);
map.put("b",cc);
cc.set(3);
map.put("c",cc);

System.out.println(((Bean)map.get("a")).get());//为什么要强制转换为Bean型,输出为什么是 3 ?
}
}
输出结果为: 3 

//各位高手帮小弟解答一下上面的问题,谢谢啦!!

------解决方案--------------------

------解决方案--------------------
cc是Bean类的引用对象
------解决方案--------------------
lz,这里有一点很关键的是,Java的语义是 引用语义,并非C++的值语义。

map.put("a",cc); //这里的“值”,为什么可以用cc(对象),cc中有值吗?
cc.set(2);
map.put("b",cc);
cc.set(3);
map.put("c",cc);

这三次存放到map中的都是同一个对象,也就是cc变量所引用的对象。
而并不是存入了cc的copy。




------解决方案--------------------
Java code
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 的值了.

Java code
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异常。

另外,也可以考虑使用泛型机制。