繁体   English   中英

HashMap之间的区别 <String,String> 和清单 <NameValuePair>

[英]Difference between HashMap<String,String> and List<NameValuePair>

在调用loginTask时,我必须发送用户名和密码。 现在我尝试用HashMap<String,String>替换此List<NameValuePair>代码,但是我不能。 知道我需要知道它们之间的区别。 什么时候应该使用列表以及什么时候应该使用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 (在Java中是java.util.Map接口的实现,理论上称为哈希表)允许您在O(1)进行访问,而在n对列表中则具有O(n)访问时间。

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

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

除此之外,两个String不能不构成NameValuePair( http://developer.android.com/reference/org/apache/http/NameValuePair.html );)

HashMap是键/值对的集合,当要基于键检索和插入值时,应使用HashMap。

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

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

UrlEncodedFormEntity构造函数仅接受List <? extends NameValuePair> List <? extends NameValuePair>而不是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

我在此处添加答案,因为我可以看到其他答案之间有些混淆。

首先, HashMap<K,V>Map<K,V>接口的实现,而List<E>只是一个接口,需要实现。 ArrayList<E>是这样的实现。

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

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

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

你的情况,你不能代替List<NameValuePair>HashMap<String,String> ,因为,如图所示这里URLEncodedFormEntity只接受List<? extends NameValuePair> List<? extends NameValuePair>Iterable<? 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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM