Java 在同步方法中使用hashmap迭代器时

Java 在同步方法中使用hashmap迭代器时,java,multithreading,hashmap,Java,Multithreading,Hashmap,假设我有一个Hashmap,看起来像: 关键词:价值 (字符串1,队列1) (字符串2,队列2) (字符串3,队列3) 我还有一个将访问此hashmap的同步方法,并且在该方法中创建了一个迭代器: Iterator it = hashmap.iterator(); while(it.hasNext()){ Queue q = it.next(); QueueItem item = q.get(0); return item; } 现在我有两个线程调用这

假设我有一个Hashmap,看起来像:

关键词:价值

(字符串1,队列1)

(字符串2,队列2)

(字符串3,队列3)

我还有一个将访问此hashmap的同步方法,并且在该方法中创建了一个迭代器:

 Iterator it = hashmap.iterator();
 while(it.hasNext()){
      Queue q = it.next();
      QueueItem item = q.get(0);
      return item;
 }
现在我有两个线程调用这个方法,当线程1调用时,它将得到一个迭代器,指向(字符串1,队列1);我的问题是,当线程2调用时,迭代器会指向(字符串1,队列1)还是(字符串2,队列2)?

调用迭代器()会创建一个位于集合开始处的新的迭代器,因此它将始终为您提供映射实现的第一个条目

使用HashMap时,排序是未定义的,但您可以使用其他映射实现来控制排序(LinkedHashMap、TreeMap等)

调用迭代器()将创建一个位于集合开始处的新的迭代器,因此它将始终为您提供映射实现的第一个条目

使用HashMap时,排序是未定义的,但您可以使用其他映射实现来控制排序(LinkedHashMap、TreeMap等)

调用迭代器()将创建一个位于集合开始处的新的迭代器,因此它将始终为您提供映射实现的第一个条目

使用HashMap时,排序是未定义的,但您可以使用其他映射实现来控制排序(LinkedHashMap、TreeMap等)

调用迭代器()将创建一个位于集合开始处的新的迭代器,因此它将始终为您提供映射实现的第一个条目



使用HashMap时,排序是未定义的,但您可以使用其他映射实现来控制排序(LinkedHashMap、TreeMap等)

两者都不需要。使方法
同步
意味着最多一个线程可以执行它。第二个线程必须等待另一个线程在进入方法之前完全完成方法执行。假设两个线程在同一个对象上调用该方法,那么如果该方法不遍历整个hashmap呢?对于exmaple,它将只从队列中获取一个项目。谢谢,正如前面所说,每次执行时都会创建一个新的
迭代器
,因此以前的
迭代器
的状态完全不相关。因此,每个新的迭代器都能够对映射的所有条目进行迭代,但如果愿意,可以提前终止。
hashmap.iterator()
不会编译。您可能是指
hashmap.values().iterator()
。两者都不是。使方法
同步
意味着最多一个线程可以执行它。第二个线程必须等待另一个线程在进入方法之前完全完成方法执行。假设两个线程在同一个对象上调用该方法,那么如果该方法不遍历整个hashmap呢?对于exmaple,它将只从队列中获取一个项目。谢谢,正如前面所说,每次执行时都会创建一个新的
迭代器
,因此以前的
迭代器
的状态完全不相关。因此,每个新的迭代器都能够对映射的所有条目进行迭代,但如果愿意,可以提前终止。
hashmap.iterator()
不会编译。您可能是指
hashmap.values().iterator()
。两者都不是。使方法
同步
意味着最多一个线程可以执行它。第二个线程必须等待另一个线程在进入方法之前完全完成方法执行。假设两个线程在同一个对象上调用该方法,那么如果该方法不遍历整个hashmap呢?对于exmaple,它将只从队列中获取一个项目。谢谢,正如前面所说,每次执行时都会创建一个新的
迭代器
,因此以前的
迭代器
的状态完全不相关。因此,每个新的迭代器都能够对映射的所有条目进行迭代,但如果愿意,可以提前终止。
hashmap.iterator()
不会编译。您可能是指
hashmap.values().iterator()
。两者都不是。使方法
同步
意味着最多一个线程可以执行它。第二个线程必须等待另一个线程在进入方法之前完全完成方法执行。假设两个线程在同一个对象上调用该方法,那么如果该方法不遍历整个hashmap呢?对于exmaple,它将只从队列中获取一个项目。谢谢,正如前面所说,每次执行时都会创建一个新的
迭代器
,因此以前的
迭代器
的状态完全不相关。因此,每个新的迭代器都能够对映射的所有条目进行迭代,但如果愿意,可以提前终止。
hashmap.iterator()
不会编译。您可能指的是
hashmap.values().iterator()
。我们说的是hashmap,所以不能保证哪一对是第一对,但唯一重要的是
iterator
将始终迭代所有值。@Holger是对的,hashmap不能保证任何顺序,但是LinkedHashMap将保持原始的插入顺序。你也可以使用树形图进行自然排序(使用可比较的键)@Toill只需编辑你谈论迭代顺序的部分,Holger肯定知道java中的映射是如何工作的哈希映射中的排序是完全随机的,而不是基于哈希代码!事实上,排序可以随着时间的推移而改变(由于调整操作的大小,但这是一个实现细节,如果不可避免的话)@Adam技术上的“随机”是可以接受的,因为文档没有保证,但你显然是对的——应该是任意的。我们讨论的是哈希映射,所以不能保证哪一对