HashMap <string,string>和List <namevaluepair> </namevaluepair> </string,string>之间的区别

时间:2014-07-09 06:22:41

标签: java android hashmap

在调用loginTask时,我必须发送用户名和密码。现在我尝试用List<NameValuePair>替换此HashMap<String,String>代码,但我不能。知道我需要知道它们之间的区别。什么时候我应该使用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);

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

UrlEncodedFormEntity构造函数仅接受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

答案 4 :(得分:0)

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

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

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

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

但是,ListMap的目的不同,所以比较仍然不合时宜。

在您的情况下,您无法将List<NameValuePair>替换为HashMap<String,String>,因为如图所示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);