【问题标题】:Difference between HashMap<String,String> and List<NameValuePair>HashMap<String,String> 和 List<NameValuePair> 的区别
【发布时间】:2014-08-30 01:31:32
【问题描述】:

在调用 loginTask 时,我必须发送用户名和密码。现在我尝试用HashMap&lt;String,String&gt; 替换这个List&lt;NameValuePair&gt; 代码,但我做不到。知道我需要知道它们之间的区别。什么时候应该使用 List,什么时候应该使用 HashMap

    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);

【问题讨论】:

  • 如何替换? HashMap 属于Map,而List 属于List
  • 请解释一下列表和地图@PhamTrung之间的区别
  • @Nepster 哈哈,看看我在评论里给你的链接 :) Geek 的链接也不错。
  • 我如何接受 Geek Answer。感谢 PhamTrung 和 Geek

标签: java android hashmap


【解决方案1】:

我在这里添加我的答案,因为我可以看到其他答案之间存在一些混淆。

首先HashMap&lt;K,V&gt;Map&lt;K,V&gt;接口的实现,而List&lt;E&gt;只是一个接口,需要实现。 ArrayList&lt;E&gt;就是这样一个实现。

当您想将某些键与某些值相关联时,可以使用 Map。例如,通用 JSON 解析器将 JSON 对象存储在 HashMap 中是有意义的。另一方面,当您希望拥有有序的项目集合时,可以使用 List。

我想澄清的另一件事是,与@KarlRichter 提到的相反,List 的实现如果正确完成,将访问 O(1) 中的元素,而不是 O(n )。他似乎将ListLinkedList 混淆了。 HashMap,通常会增加散列的开销,所以它可能比 List 慢一点(在大多数情况下不明显),但在技术上它仍然会保持 O(1)。

但是,ListMap 的用途不同,因此比较仍然没有意义。

在您的情况下,您不能将List&lt;NameValuePair&gt; 替换为HashMap&lt;String,String&gt;,因为如图所示hereURLEncodedFormEntity 在所有可用的构造函数中仅接受List&lt;? extends NameValuePair&gt;Iterable&lt;? extends NameValuePair&gt;

如果您必须使用HashMap&lt;String,String&gt;,您可以进行某种转换,如下所示:

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); 

【讨论】:

    【解决方案2】:

    HashMap(在 Java 中是 java.util.Map 接口的实现,理论上称为哈希表)允许您在 O(1) 中访问,而在 n 对列表中您有 O(n) 访问时间。

    要使用的选择既与用例有关(我在下面的评论中留下了建议,因为它指的是您非常具体的用例)以及软件工程不同维度之间的权衡,例如如果您不熟悉Maps,您可能会遇到与性能改进相反的维护开销(在这种情况下以 O 表示法表示)。这是一个决定。

    【讨论】:

    • 何时选择哪一个。
    • 这取决于@Nepster 您的列表中有多少值?多个登录用户名或密码还是只有一个?
    • 它不仅仅取决于列表的大小,还取决于在将数据结构传递给 UrlEncodedFormEntity 构造函数之前要对其执行的操作。如果您需要经常访问数据,那么值得创建一个Map 并在构造函数调用之前将其转换为列表。永远不要低估旧的 O(1) 哈希表的力量。
    【解决方案3】:

    UrlEncodedFormEntity 构造函数只接受 List &lt;? extends NameValuePair&gt; 而不是 HashMap 并使用 format() 即以下算法创建结果

    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

    【讨论】:

      【解决方案4】:

      HashMap 是键/值对的集合,当人们想要根据键检索和插入值时应该使用它。

      您可以在下面的代码中使用它,

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

      【讨论】:

      • NameValuePair 也是如此。请参阅我的问题。我正在传递用户名和密码
      • 对,但是要检索密码或用户名,您必须遍历列表并找出与“用户名”或密码匹配的 NameValuePair。如果列表变大,这将是低效的。
      • @Nepster 字符串映射与对列表不同。在 map 的情况下,数据结构中保存的值是一个字符串。它碰巧被一个字符串索引,但并不总是如此。在列表的情况下,数据结构中保存的值是两个字符串的实际对。
      【解决方案5】:

      UrlEncodedFormEntity (http://developer.android.com/reference/org/apache/http/client/entity/UrlEncodedFormEntity.html) 的构造函数只接受 List 作为参数,因此编译器将拒绝使用(任何类型的)HashMap

      除此之外,两个字符串不能组成一个 NameValuePair (http://developer.android.com/reference/org/apache/http/NameValuePair.html) ;)

      【讨论】:

        猜你喜欢
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-22
        • 2017-05-08
        • 1970-01-01
        相关资源
        最近更新 更多