在调用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);
答案 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();
}
答案 4 :(得分:0)
我在这里添加我的答案,因为我可以看到其他答案之间存在一些混淆。
首先,HashMap<K,V>
是Map<K,V>
接口的实现,而List<E>
只是一个需要实现的接口。 ArrayList<E>
就是这样的实现。
如果要将某些键与某些值相关联,则使用Map。例如,通用JSON解析器将JSON对象存储在HashMap中是有意义的。另一方面,如果您想拥有一个有序的项目集合,则使用List。
我想澄清的另一件事是,与@KarlRichter提到的相反,List
的实现,如果正确完成,将访问O(1)中的元素,而不是O中的元素(N)。他似乎把List
与LinkedList
混为一谈。 HashMap
通常会增加散列的开销,因此它可能比List
慢一点(在大多数情况下不明显),但技术上仍然是O(1)。
但是,List
与Map
的目的不同,所以比较仍然不合时宜。
在您的情况下,您无法将List<NameValuePair>
替换为HashMap<String,String>
,因为如图所示here,URLEncodedFormEntity
仅接受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);