Java中的Map接口

Gur*_*sad 3 java reference

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++;                
         }       
     }         
Run Code Online (Sandbox Code Playgroud)

cor*_*iKa 6

它返回对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
Run Code Online (Sandbox Code Playgroud)

你只使用一个矢量.您将矢量放入地图中,然后在下一次迭代中清除它.好吧,你刚刚清除了地图内的矢量!仅仅因为你把它放在地图上并不意味着它无法改变.

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

所以更换

t.clear();
Run Code Online (Sandbox Code Playgroud)

t = new Vector<String>();
Run Code Online (Sandbox Code Playgroud)