我正在阅读Javadoc for LinkedHashMap,其中提到了它:
putAll方法为指定映射中的每个映射生成一个条目访问,其顺序为指定映射的条目集迭代器提供键-值映射。
我的问题是,“每个映射一个入口访问”是什么意思。如果有人可以帮助提供一个例子来阐明这一点,将不胜感激。
某些测试用例在我的应用程序中失败,这取决于元素的插入顺序.它曾经在Java 7中运行良好但是这个问题在升级到Java 8之后就开始了.在搜索互联网时我在一篇文章中找到了这个 :
Java 8包含对HashSet/Map迭代顺序的一些可能的更改:
有些人可以建议我 - 我怎样才能以与插入顺序相同的顺序迭代Map中的对象,考虑到我仍然在我的开发环境中使用Java 1.8?
是的,当然HashMap从未保证可以按相同的顺序检索对象,但是它曾经在java 7中工作.
不LinkedHashMap工作,落实呢?
所以我想将LinkedHashMap传递给intent.
//SEND THE MAP
Intent singlechannel = new Intent(getBaseContext(),singlechannel.class);
singlechannel.putExtra("db",shows1);//perase to
startActivity(singlechannel);
//GET THE MAP
LinkedHashMap<String,String> db = new LinkedHashMap<String,String>();
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");
Run Code Online (Sandbox Code Playgroud)
这个就像HashMap的魅力一样.但是使用LinkedHashMap我遇到了一个问题,我在这里遇到了运行时错误
db=(LinkedHashMap<String,String>) getIntent().getSerializableExtra("db");
Run Code Online (Sandbox Code Playgroud)
我没有得到HashMap的错误.
我还收到一个警告"类型安全:从Serializable到LinkedHashMap的未经检查的强制转换"但我也对HashMap发出了警告.任何想法.非常感谢任何帮助
如果我有数据结构
Stock
{
String Symbol;
LinkedHashMap<Date,Double> DateForPrice;
}
Run Code Online (Sandbox Code Playgroud)
我知道在LinkedHashMap中,我可以获得特定日期的股票价格,而无需遍历整个列表.
但是,如果我想从特定日期开始迭代DateForPrice的LinkedHashMap,有没有办法在不遍历整个列表的情况下执行它?
正如我所提到的LinkedHashMap的文档,它说,内部维护双链表(DLL)
我试图理解为什么选择DLL而不是S(ingle)LL我用DLL获得的最大优势是向后遍历,但我没有看到LinkedHashMap()利用这个优势的任何用例,因为之前没有( )Iterable接口中的next()类操作.
任何人都可以解释为什么是DLL,而不是SLL?
我在我的类中使用了一个Map对象,我已经与LinkedHashMap的Collections.synchronizedMap()同步,如下所示:
private GameObjectManager(){
gameObjects = Collections.synchronizedMap(new LinkedHashMap<String, GameObject>());
}
Run Code Online (Sandbox Code Playgroud)
我在这个函数的第三行得到一个并发修改异常:
public static void frameElapsed(float msElapsed){
if(!INSTANCE.gameObjects.isEmpty()){
synchronized(INSTANCE.gameObjects){
for(GameObject object : INSTANCE.gameObjects.values()){...}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在迭代Map的所有其他位置,我按照文档同步地图.
我的类中还有其他函数使用这个Map(同步的!)和put()和remove()对象,但这应该无关紧要.我究竟做错了什么?请询问更多代码,不知道还能提供什么.
哦,和日志消息:
08-20 15:55:30.109: E/AndroidRuntime(14482): FATAL EXCEPTION: GLThread 1748
08-20 15:55:30.109: E/AndroidRuntime(14482): java.util.ConcurrentModificationException
08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:350)
08-20 15:55:30.109: E/AndroidRuntime(14482): at java.util.LinkedHashMap$ValueIterator.next(LinkedHashMap.java:374)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GameObjectManager.frameElapsed(GameObjectManager.java:247)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GamekitInterface.render(Native Method)
08-20 15:55:30.109: E/AndroidRuntime(14482): at package.GamekitInterface.renderFrame(GamekitInterface.java:332)
08-20 15:55:30.109: E/AndroidRuntime(14482): at com.qualcomm.QCARSamples.ImageTargets.GameEngineInterface.onDrawFrame(GameEngineInterface.java:107)
08-20 15:55:30.109: E/AndroidRuntime(14482): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1516)
08-20 15:55:30.109: E/AndroidRuntime(14482): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
Run Code Online (Sandbox Code Playgroud) java multithreading synchronized linkedhashmap concurrentmodification
我被包裹LinkedHashMap<String, LinkedHashMap<Date, Double>>在一个列表中;
List<LinkedHashMap<String, LinkedHashMap<Date, Double>>> list = new ArrayList(mainCodesMap.entrySet());
Run Code Online (Sandbox Code Playgroud)
这mainCodeMap是类型Map<String, Map<Date, Double>>
问题是列表没有问题,但是,当我尝试在 for 循环中按索引获取列表元素时;
for (int i = 0; i < correMatrix.length; i++) {
LinkedHashMap<String, LinkedHashMap<Date, Double>> entryRow = list.get(i);
LinkedHashMap<Date, Double> entryRowData = (LinkedHashMap<Date, Double>) entryRow.values();
..
..
}
Run Code Online (Sandbox Code Playgroud)
jvm throwsClassCastException说;
java.lang.ClassCastException: java.util.LinkedHashMap$Entry cannot be cast to java.util.LinkedHashMap
Run Code Online (Sandbox Code Playgroud) 我正在使用 aLinkedHashMap<Integer, Integer>来存储 2D 游戏中图块上的图层值。较高的数字覆盖较低的数字。
在我的绘制函数中,我迭代设置的值并绘制每个值。这意味着我要(width * height * numLayers)多次拆箱价值观。我计划移植到 Android,因此我希望尽可能高效,但我认为这太多了?
我使用地图的原因是因为层数(键)很重要:4 以上的键是在玩家上方绘制的,等等。所以我经常需要跳过一堆键。
我可能可以只使用 an,int[10]因为我不需要那么多层,但是与我当前的 HashMap 相比,所有未使用的层都会占用 32 位,而我当前的 HashMap 可以有键 0、9,只占用 64 位位。
我得到类似的数据
{"ABC的员工1","ABCX"},{"ABC的员工2","ABCY"},{"ABC的员工3","ABCZ"}
从数据库到RefCursor.
我有一个案例,我需要保留从数据库中读取数据的顺序.由于我的数据是一种"键值",我想到了使用了一个Map有序的实现.因此选择了LinkedHashMap
//defined as a static map inside a common utlity class
public class Common{
public static final LinkedHashMap<String, String> empMap = new LinkedHashMap<String, String>();
}
//rs is the resultset
if (rs != null) {
while (rs.next()) {
key = rs.getString("name_text");
value = rs.getString("id");
Common.empMap.put(key, value);
}
}
Run Code Online (Sandbox Code Playgroud)
我必须按照从数据库(Cursor)检索它的顺序将密钥传递给客户端.
List<String> empList = new ArrayList<String>(Common.empMap.keySet());
Run Code Online (Sandbox Code Playgroud)
keySet() - 文档说"返回此映射中包含的键的Set视图.该集由映射支持,因此对映射的更改将反映在集合中,反之亦然"
我所期待的是,由于ArrayList也是一个有序集合,我应该以与检索/插入密钥相同的方式获取密钥Map.
当我做一个示例测试程序时,我得到了预期的结果.
public class LinkedMap {
public static void main(String[] args) { …Run Code Online (Sandbox Code Playgroud) Java 或第三方库中是否有保留插入顺序的 Map(类似于 LinkedHashMap),它还会在比较(equals()和hashCode()方法)期间检查键的顺序?所以这Map(a => 1, b => 2)会不同于Map(b => 2, a => 1).
与下面类似,但我不想重新发明和维护轮子:
public class EqualityStrictLinkedMap<K, V> extends ForwardingMap<K, V>
{
...
@Override
public boolean equals(Object o)
{
if (!(o instanceof Map))
return false;
Map<K, V> that = (Map<K, V>) o;
return Iterables.elementsEqual(entrySet(), that.entrySet());
}
@Override
public int hashCode()
{
int h = 1;
for (Map.Entry<K, V> entry: entrySet()) {
h = (h*31 + Objects.hashCode(entry.getKey()))*31 + Objects.hashCode(entry.getValue());
}
return h; …Run Code Online (Sandbox Code Playgroud) linkedhashmap ×10
java ×9
android ×2
autoboxing ×1
hashmap ×1
java-8 ×1
list ×1
map ×1
synchronized ×1
traversal ×1
unboxing ×1