[英]How to convert List<NameValuePair> into a hashMap<String, String>?
[英]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();
}
我在此处添加答案,因为我可以看到其他答案之间有些混淆。
首先, HashMap<K,V>
是Map<K,V>
接口的实现,而List<E>
只是一个接口,需要实现。 ArrayList<E>
是这样的实现。
当您要将某些键与某些值关联时,可以使用Map。 例如,对于通用JSON解析器来说,将JSON对象存储在HashMap中是有意义的。 另一方面,当您想要有序的项目集合时使用列表。
我想澄清的另一件事是,与@KarlRichter提到的相反, List
的实现(如果正确完成)将访问O(1)中的元素,而不是O(n)中的元素。 他似乎已经将List
与LinkedList
混淆了。 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.