Java中的映射接口



Map#get方法是返回键映射到的值,还是返回对该值的引用?代码(这是我正在开发的一个程序):

    Map<String,Vector<String>> map=new TreeMap<String,Vector<String> >();  
    for(String line:services)
    {
         String[] set=line.split(" ");
         Vector<String> t=new Vector<String>();
         String BioService=set[0];             
         int i=1;              
         while(i<set.length)
         {  
              t.clear();                        
              if(map.containsKey(set[i]))
                  t=map.get(set[i]);                                                                                          
              t.addElement(BioService);               
              map.put(set[i],t);
              /*if i put t.clear() here i get null values in my output*/                                                                                                                                     
              i++;                
         }       
     }         

它返回对Object的引用。

在Java中,你永远不会有真正的Object,只有对它的引用

您确实有实际的基本体(不能引用基本体,只能引用包裹基本体的对象或类似的对象),但当然基本体不能放入地图中,只有对象可以。

假设您有以下代码:

Map<String,Vector<String>> map = new HashMap... // etc
Vector<String> vec = new Vector<String>();
vec.addElement("foo");
map.put("foo",vec);
vec.clear();
vec.addElement("bar");
map.put("bar",vec);
Vector<String> ret = map.get("foo");
System.out.println(ret.get(0)); // prints bar

你只能使用一个向量。你把向量放进地图,然后在下一次迭代中清除它。好吧,你刚刚清除了地图内的向量!仅仅因为你把它放在地图上并不意味着它不能改变。

我觉得,你最好的办法是为每个条目制作一个新的向量。

所以更换

t.clear();

带有

t = new Vector<String>();

所有非基元类型都作为Java中的引用进行处理。因此,get方法将返回对映射项的引用。

最新更新