我知道从Map的keySet()方法返回的Set不保证任何特定的顺序.
我的问题是,它是否保证多次迭代的相同顺序.例如
Map<K,V> map = getMap();
for( K k : map.keySet() )
{
}
...
for( K k : map.keySet() )
{
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,假设映射不修改,将迭代在按键组处于相同的顺序.使用Sun的jdk15它会以相同的顺序迭代,但在我依赖于这种行为之前,我想知道所有JDK是否都会这样做.
编辑
我从答案中看到我不能依赖它.太糟糕了.我希望不必为了保证我的订购而建立一些新的收藏品.我的代码需要迭代,执行一些逻辑,然后使用相同的顺序再次迭代.我将从keySet创建一个新的ArrayList,这将保证顺序.
我注意到在执行中有些奇怪HashMap.clear().这就是它在OpenJDK 7u40中的表现:
public void clear() {
modCount++;
Arrays.fill(table, null);
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
这就是OpenJDK 8u40的外观:
public void clear() {
Node<K,V>[] tab;
modCount++;
if ((tab = table) != null && size > 0) {
size = 0;
for (int i = 0; i < tab.length; ++i)
tab[i] = null;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道现在table为空地图可以为null,因此需要在局部变量中进行额外的检查和缓存.但为什么被Arrays.fill()for-loop取代?
似乎在此提交中引入了更改.不幸的是,我没有找到解释为什么普通for循环可能比更好Arrays.fill().它更快吗?还是更安全?
我将值放入形式的hashmap中,
Map<Long, Double> highLowValueMap=new HashMap<Long, Double>();
highLowValueMap.put(1l, 10.0);
highLowValueMap.put(2l, 20.0);
Run Code Online (Sandbox Code Playgroud)
我想用values()map方法创建一个列表.
List<Double> valuesToMatch=new ArrayList<>();
valuesToMatch=(List<Double>) highLowValueMap.values();
Run Code Online (Sandbox Code Playgroud)
要么
List<Double> valuesToMatch=(List<Double>) highLowValueMap.values();
Run Code Online (Sandbox Code Playgroud)
但是,它会引发异常:
线程"main"中的异常java.lang.ClassCastException:
java.util.HashMap $不能将值强制转换为java.util.List
但它允许我将其传递给列表的创建:
List<Double> valuesToMatch = new ArrayList<Double>( highLowValueMap.values());
Run Code Online (Sandbox Code Playgroud) 我是Android开发的新手,我正在尝试在Android示例项目中使用HashMap.现在,我正在做学习android的示例项目.我只是在HashMap中存储键和值,我想在EditView中显示键及其值.我在我的示例项目中按照下面的代码.但是,第一个键和值仅在EditView中打印.
Map<String, String> map = new HashMap<String,String>();
map.put("iOS", "100");
map.put("Android", "101");
map.put("Java", "102");
map.put(".Net", "103");
Set keys = map.keySet();
for (Iterator i = keys.iterator(); i.hasNext(); ) {
String key = (String) i.next();
String value = (String) map.get(key);
textview.setText(key + " = " + value);
}
Run Code Online (Sandbox Code Playgroud)
在EditView iOS = 100中只打印.我想在EditText中打印所有键及其值.谁能告诉我我做错了什么?提前致谢.
如何将HashMap值从一个Intent 发送到第二个Intent?
另外,如何HashMap在第二个Activity中检索该值?
我需要类似于Java中的HashMap的PHP对象,但是当我用Google搜索时我没有找到,所以如果有人知道我如何在PHP中模仿HashMaps,那么将非常感谢帮助.
我是Android的新手.在我正在使用的Android应用程序中HashMap,但我收到警告:
**"Use new SparseArray<String>(...) instead for better performance"**
Run Code Online (Sandbox Code Playgroud)
这意味着什么,我该如何使用SparseArray<String>呢?
当给定一组静态对象(在某种意义上是静态的,一旦加载它很少会发生变化),需要重复的并发查找以及最佳性能,哪个更好,一个HashMap或一个二进制搜索使用一些自定义比较器的数组?
答案是对象或结构类型的函数吗?哈希和/或平等功能表现?哈希的独特性?清单大小? Hashset尺寸/尺寸?
我正在看的集合的大小可以是500k到10m之间的任何地方 - 这些信息很有用.
虽然我正在寻找一个C#答案,但我认为真正的数学答案不在于语言,所以我不包括那个标签.但是,如果需要注意C#特定的事情,那么需要该信息.
我试图找出如何将键和值对从一个过滤器过滤到另一个过滤器
例如,我想采取这个哈希
x = { "one" => "one", "two" => "two", "three" => "three"}
y = x.some_function
y == { "one" => "one", "two" => "two"}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助
编辑:应该提一下,在这个例子中,我希望它表现为白名单过滤器.也就是说,我知道我想要什么,而不是我不想要的.
可能重复:
在Java集合中存储原始值?
在java中我使用以下内容: -
public HashMap<char, int> buildMap(String letters)
{
HashMap<char, int> checkSum = new HashMap<char, int>();
for ( int i = 0; i < letters.length(); ++i )
{
checkSum.put(letters.charAt(i), primes[i]);
}
return checkSum;
}
Run Code Online (Sandbox Code Playgroud)
我收到与不适当类型有关的错误.我分别使用Character和Integer而不是char和int解决了我的问题.但是,我无法弄清楚为什么HashMap无法处理原始数据类型.