2014-07-09 113 views
0

在調用loginTask時,我必須發送用戶名和密碼。現在我試圖用HashMap<String,String>代替這List<NameValuePair>代碼,但我不能。知道我需要知道他們之間的區別。什麼時候應該使用列表,當我用HashMapHashMap <String,String>和List <NameValuePair之間的區別

HttpClient httpclient = new DefaultHttpClient(); 

    HttpPost httppost = new HttpPost(URL); 

    List<NameValuePair> list = new ArrayList<NameValuePair>(); 

    list.add(new BasicNameValuePair("username", params[0])); 

    list.add(new BasicNameValuePair("password", params[1])); 

    httppost.setEntity(new UrlEncodedFormEntity(list)); 

    HttpResponse responce = httpclient.execute(httppost); 

    HttpEntity httpEntity = responce.getEntity(); 

    response = EntityUtils.toString(httpEntity); 
+0

你如何替換? HashMap屬於[Map](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html),而List是[List](http://docs.oracle.com /javase/7/docs/api/java/util/List.html)。 –

+1

http://stackoverflow.com/questions/2395814/difference-between-hashmap-and-array-list-in-java – Geek

+0

親切地解釋一下列表和地圖之間的區別@PhamTrung – Nepster

回答

2

一個HashMap(在Java中理論上java.util.Map接口和實施稱爲哈希表)允許您在O(1)n對列表訪問,而你有O(n)訪問時間。

使用的選擇都與用例有關(我在下面的評論中留下了一些建議,因爲它涉及到您的特定用例),以及軟件工程的不同維度之間的折衷。如果您不熟悉Map,您可能會遇到維護開銷,與性能改進相反(在此情況下表示爲O符號)。這是一個決定。

+0

什麼時候選擇哪一個。 – Nepster

+0

取決於@Nepster有多少值將在你的列表中?許多登錄用戶名或密碼或只是一個? – KOTIOS

+0

它不是簡單地依賴列表的大小,而是依賴於要在數據結構上執行的操作,然後將它傳遞給UrlEncodedFormEntity構造函數。如果您需要經常訪問數據,那麼值得創建一個Map並在構造函數調用之前將其轉換爲列表。永遠不要低估散列表中古老的「O(1)」的威力。 –

1

HashMap是鍵/值對的集合,當想要基於鍵檢索和插入值時,應該使用它。

您可以在此代碼類似下面使用它,

Map<String, String> map = new HashMap<String, String>(); 
map.put("username",param[0]); 
map.put("password",param[1]); 
+0

NameValuePair執行相同的操作。看到我的問題。我正在傳遞用戶名和密碼 – Nepster

+0

正確,但是爲了獲取密碼或用戶名,您必須遍歷列表並找出哪個NameValuePair匹配「用戶名」或密碼。如果名單變得更大,這將是低效的。 – dips

+0

@Nepster字符串的映射不是相同的列表對。在映射情況下,數據結構中的值保持是一個字符串。它恰好被一個字符串索引,但並非總是如此。在列表情況下,數據結構中的值保持爲兩個字符串的實際對。 –

0

UrlEncodedFormEntity構造函數只接受List <? extends NameValuePair>HashMap和使用格式(),即下面的算法

public static String format (
      final List <? extends NameValuePair> parameters, 
      final String encoding) { 
     final StringBuilder result = new StringBuilder(); 
     for (final NameValuePair parameter : parameters) { 
      final String encodedName = encode(parameter.getName(), encoding); 
      final String value = parameter.getValue(); 
      final String encodedValue = value != null ? encode(value, encoding) : ""; 
      if (result.length() > 0) 
       result.append(PARAMETER_SEPARATOR); 
      result.append(encodedName); 
      result.append(NAME_VALUE_SEPARATOR); 
      result.append(encodedValue); 
     } 
     return result.toString(); 
    } 

創建結果上看一看以下鏈接 http://grepcode.com/file/repo1.maven.org/maven2/org.apache.httpcomponents/httpclient/4.0/org/apache/http/client/entity/UrlEncodedFormEntity.java

0

我在這裏添加我的答案因爲我可以看到其他答案中存在一些混淆。

首先,HashMap<K,V>Map<K,V>接口的實現,而List<E>只是一個需要實現的接口。 ArrayList<E>就是這樣的一個實現。

當您想要將某些鍵與特定值相關聯時使用地圖。例如,通用JSON解析器將JSON對象存儲在HashMap中是有意義的。另一方面,當你想要有一個有序的項目集合時,使用列表。

我想澄清的另一件事是,與@KarlRichter提到的相反,如果執行正確,List的實現將訪問O(1)中的元素,而不是O(n)中的元素, 。他似乎已將ListLinkedList混淆。 A HashMap,通常會增加散列的開銷,所以它可能會比List慢(在大多數情況下不明顯),但它在技術上仍然保持O(1)。

但是,List的用途與Map的用途不同,因此比較仍然不正確。

在你的情況,你不能用HashMap<String,String>取代List<NameValuePair>,因爲,如圖所示hereURLEncodedFormEntity只接受所有的構造List<? extends NameValuePair>Iterable<? extends NameValuePair>

如果你必須使用一個HashMap<String,String>,你可以做一些轉換,如下所示:

public List<NameValuePair> hashMapToNameValuePairList(HashMap<String,String> map) { 

    List<NameValuePair> list = new ArrayList<NameValuePair>(); 

    for (Map.Entry<String, String> entry : map.entrySet()) { 
     String key = entry.getKey(); 
     String value = entry.getValue(); 
     list.add(new BasicNameValuePair(key, value)); 
    } 

    return list; 
} 

這樣,那麼,你從HashMap中創建您的列表如下圖所示:

List<NameValuePair> list = hashMapToNameValuePairList(yourHashMap); 
相關問題