Tag: hashmap

从multithreading获取java.util.HashMap的值是否安全(不需要修改)?

有一种情况是地图将被构build,一旦它被初始化,它将不会再被修改。 然而,它将被访问(仅通过get(key))来自多个线程。 以这种方式使用java.util.HashMap是否安全? (目前,我很高兴地使用java.util.concurrent.ConcurrentHashMap ,并没有任何需要提高性能的措施,但是只要简单的HashMap就足够了就可以了,所以这个问题不是 “我该用哪一个? “这也不是一个performance问题,而是问题是”安全吗?“)

Python字典是一个哈希表的例子吗?

Python中的基本数据结构之一是字典,它允许用户logging“键”来查找任何types的“值”。 这是作为一个哈希表内部实现吗? 如果不是,那是什么?

如何在HashMap中保留插入顺序?

我正在使用一个HashMap 。 当我遍历地图时,数据以(通常相同的)随机顺序返回。 但数据是按特定顺序插入的,我需要保留插入顺序。 我该怎么做?

在HashMap中了解equals和hashCode的工作原理

我有这个testing代码: import java.util.*; class MapEQ { public static void main(String[] args) { Map<ToDos, String> m = new HashMap<ToDos, String>(); ToDos t1 = new ToDos("Monday"); ToDos t2 = new ToDos("Monday"); ToDos t3 = new ToDos("Tuesday"); m.put(t1, "doLaundry"); m.put(t2, "payBills"); m.put(t3, "cleanAttic"); System.out.println(m.size()); } } class ToDos{ String day; ToDos(String d) { day = d; } public […]

HashMap获取/放置复杂性

我们习惯于说HashMap get/put操作是O(1)。 但是这取决于哈希实现。 默认对象散列实际上是JVM堆中的内部地址。 我们确定它是否足以说明get/put是O(1)? 可用内存是另一个问题。 正如我从javadocs了解到的, HashMap load factor应该是0.75。 如果我们在JVM中没有足够的内存并且load factor超出限制呢? 所以,看起来O(1)是不能保证的。 这是有道理的,还是我错过了什么?

ConcurrentModificationException和一个HashMap

我正在使用JPA持久对象。 主对象与另一个对象拥有一对多的关系。 另一个对象存储在一个HashMap中。 什么样的同步可以解决这个问题? 这似乎发生在完全随机的时间,是非常不可预知的。 这是我得到的例外: Exception in thread "pool-1-thread-1" java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextEntry(Unknown Source) at java.util.HashMap$ValueIterator.next(Unknown Source) at org.hibernate.collection.AbstractPersistentCollection$IteratorProxy.next(AbstractPersistentCollection.java:555) at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296) at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242) at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219) at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169) at org.hibernate.engine.Cascade.cascade(Cascade.java:130)

Java HashMap真的是O(1)吗?

我已经看到了一些关于Java的hashps和它们的O(1)查找时间的有趣声明。 有人能解释为什么这样吗? 除非这些哈希algorithm与我所购买的任何哈希algorithm有很大的不同,否则肯定会存在一个包含冲突的数据集。 在这种情况下,查找将是O(n)而不是O(1) 。 有人可以解释他们是否是 O(1),如果是的话,他们是如何实现的?

如何有效地查找和插入HashMap?

我想要做以下事情: 查找某个关键的Vec ,并将其存储以备后用。 如果不存在,则为该键创build一个空的Vec ,但仍保留在该variables中。 如何有效地做到这一点? 当然,我认为我可以使用match ,但是当我尝试它,它给了我多个错误: use std::collections::HashMap; // This code doesn't compile. let mut map = HashMap::new(); let key = "foo"; let values: &Vec<isize> = match map.get(key) { Some(v) => v, None => { let default: Vec<isize> = Vec::new(); map.insert(key, default); &default } }; 我最终做了这样的事情,但我不喜欢它执行查找两次( map.contains_key和map.get )的事实: // This code does compile. […]

可变的hashmap键是一个危险的做法吗?

使用可变对象作为Hashmap键是不好的做法吗? 当您尝试使用已修改足以更改其哈希码的密钥从Hashmap中检索值时会发生什么? 例如,给出 class Key { int a; //mutable field int b; //mutable field public int hashcode() return foo(a, b); } 与代码 HashMap<Key, Value> map = new HashMap<Key, Value>(); Key key1 = new Key(0, 0); map.put(key1, value1); key1.setA(5); key1.setB(10); 如果我们现在调用map.get(key1)会怎么样? 这是安全还是可取的? 或者是依赖于语言的行为?

java.lang.OutOfMemoryError:超出GC开销限制

我得到这个错误的程序创build几个(数十万)HashMap对象与几个(15-20)文本项每个。 在提交到数据库之前,这些string都被收集起来(没有分成更小的数量)。 据Sun介绍,错误发生在“如果在垃圾收集中花费了太多时间:如果超过总时间的98%用于垃圾收集,并且小于2%的堆被恢复,则将抛出OutOfMemoryError。 ”。 显然,可以使用命令行将parameter passing给JVM 增加堆大小,通过“-Xmx1024m”(或更多)或 完全禁用错误检查,通过“-XX:-UseGCOverheadLimit”。 第一种方法工作正常,第二种结束在另一个java.lang.OutOfMemoryError,这次是关于堆。 所以,问题:是否有任何程序的替代scheme,对于特定的用例(即几个小的HashMap对象)? 例如,如果我使用HashMap clear()方法,问题就消失了,但是存储在HashMap中的数据也是如此! 🙂 在StackOverflow的相关主题中也讨论了这个问题。