2012-01-17 101 views
3

Map#get方法是否返回鍵被映射到的值,還是返回值的引用? 代碼(這是一個程序,我的工作):Java中的映射接口

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++;     
     }  
    }   
+0

如果你不管理多個線程,你應該考慮使用'ArrayList'而不是'Vector' – jere 2012-01-17 14:21:00

+0

我只是一個初學者,所以我對管理線程沒有太多的瞭解。我的問題是我如何避免影響向量t的值。假設我把t.clear()放在map.put(set [i],t)之後;地圖中的相應條目也具有空值。 – 2012-01-17 14:36:36

回答

6

它返回到對象的引用。

您將永遠不會擁有Java中的實際對象,只有對它的引用。你確實有實際的基元(並且不能引用基元,只引用包含基元或類似物體的對象),但是當然基元不能放入映射中,只有對象可以。

比方說,你有下面的代碼:

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 = new Vector<String>(); 
+0

你能解釋爲什麼如果我把t.clear()使用put方法後,我在地圖中得到空值? – 2012-01-17 14:23:23

+1

地圖中沒有空值 - 地圖中沒有值。由於您輸入的每個鍵都沒有與之關聯的值,因此返回null。從'get(K)'的Javadoc中,返回指定鍵映射到的值,如果此映射不包含鍵映射,則返回null。 – corsiKa 2012-01-17 14:24:01

+0

我的意思是說如何改變t.clear()的位置會影響鍵的值?由於我是Java新手,我發現在理解這一點時遇到了一些困難。 – 2012-01-17 14:26:16

2

所有非基本類型是作爲Java引用辦理更換

t.clear(); 

。因此,get方法將返回對映射項目的引用。