Tag: hashmap

将字符串数组转换为hashmap

我有以下回应 T2269|175@@2a1d2d89aa96ddd6|45464047 通过使用split(“\\ |”)我已经转换为字符串数组对象。 每个字段的含义如下: T2269 id 175@@2a1d2d89aa96ddd6 cid 45464047 refno 不,我必须将其转换为HashMap对象。 他们是否为上述任何解决方案.. 例如,给出了上述响应。 实际上,字符串数组对象的长度为36。

如何在并发线程中操作`values()`和`put()`时避免使用HashMap“ConcurrentModificationException”?

码: 我有一个HashMap private Map map = new HashMap(); 一种方法是通过调用put(K,V)将KV对放入其中。 另一种方法想从其值中提取一组随机元素: int size = map.size(); // size > 0 V[] value_array = map.values().toArray(new V[size]); Random rand = new Random(); int start = rand.nextInt(size); int end = rand.nextInt(size); // return value_array[start .. end – 1] 这两个方法在两个不同的并发线程中调用。 错误: 我收到了一个ConcurrentModificationException错误: at java.util.HashMap$HashIterator.nextEntry(Unknown Source) at java.util.HashMap$ValueIterator.next(Unknown Source) at java.util.AbstractCollection.toArray(Unknown Source) […]

Java:修改更改哈希码的id

我使用HashSet,我需要修改一个对象的ID,但它改变了hashcode并破坏了HashSet和hashCode()方法的规则。 什么是最佳解决方案:从Set中删除对象并使用新ID添加对象,或者在Set中的每个对象中保留哈希码(例如在构造函数中生成),还是有其他方法可以解决此问题? 感谢帮助。 更新:我犯了错误:在对象中保留哈希代码很糟糕,因为在这种情况下,相等的对象可以有不同的哈希代码。

使用Jackson将JSON字符串转换为Java映射时出错

我有这段小代码,我正在尝试将JSON字符串转换为地图。 String json = “[{‘code’:’:)’,’img’:”}]”; ObjectMapper mapper = new ObjectMapper(); Map userData = mapper.readValue(json,new TypeReference<HashMap>() { }); 但它返回以下错误: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.HashMap out of START_ARRAY token at [Source: java.io.StringReader@1b1756a4; line: 1, column: 1] at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163) at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198) at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:151) at org.codehaus.jackson.map.deser.MapDeserializer.deserialize(MapDeserializer.java:25) at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2131) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1402) at CodeSnippet_19.run(CodeSnippet_19.java:13) at org.eclipse.jdt.internal.debug.ui.snippeteditor.ScrapbookMain1.eval(ScrapbookMain1.java:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) […]

HashSet如何处理hashCode()?

我试图更深入地理解java.util.Collection和java.util.Map,但我对HashSetfunction有一些疑问: 在文档中,它说: 这个类实现了Set接口,由一个哈希表(实际上是一个HashMap实例)支持。 好的,所以我可以看到HashSet总是在后台运行Hashtable。 哈希表是一种结构,每次要向其添加新元素时都会请求键和值。 然后,基于密钥hashCode将值和密钥存储在桶中。 如果两个键的哈希码相同,则使用链表将两个键值添加到同一个桶中。 如果我说错了,请纠正我。 所以,我的问题是:如果一个HashSet总是有Hashtable在后台运行,那么每次我们使用HashSet.add()方法向HashSet添加一个新元素时,HashSet应该将它添加到它的内部Hashtable。 但是,Hashtable要求输入值和密钥 ,那么它使用什么密钥? 它是否仅使用我们尝试添加的值作为键,然后使用其hashCode? 如果我对HashSet实现说错了,请纠正我。 我的另一个问题是:一般来说,哪些类可以使用java对象的hashCode()方法? 我问这个是因为,在文档中,它说我们每次覆盖equals()方法时都需要覆盖hashCode()方法 。 好吧,这真的很有意义,但我怀疑的是,如果只是建议我们应该做的就是保持一切“美好而完美”(以这种方式),或者如果真的有必要,因为可能有很多Java默认类会不断使用对象的hashCode()方法。 在我的视野中,我看不到使用此方法的其他类而不是与集合相关的类。 非常感谢你们

只需一步即可在HashMap中声明和放置String数组

我试图将静态数据插入Java中的HashMap ,如下所示: HashMap instruments = new HashMap(); instruments.put(“EURUSD”, {“4001″,”EURUSD”,”10000″,”0.00001″,”0.1″,”USD”}); 但编译器不喜欢它。 我发现将数据插入HashMap的唯一方法是分别声明字符串数组,然后将其放入HashMap中,就像这样 String[] instruDetails = {“4001″,”EURUSD”,”10000″,”0.00001″,”0.1″,”USD”}; instruments.put(“EURUSD”, instruDetails); 但它不是很富有表现力,也很难维护 所以我的问题是,有没有办法在一个步骤/行中执行put()操作和字符串数组声明?

weakhashmap如何运作?

就像weakhashmap如何理解对其中一个键的引用现在已经过时,特别是如果键是一个汇集的String?

如果密钥以与equals不一致的方式实现Comparable,那么Java 8的HashMap是否会出错?这是一个错误吗?

我知道,从Java 8开始,如果HashMap有足够的哈希冲突,并且密钥实现了Comparable ,它将使用平衡树而不是bin的链表 。 但是从我所看到的, Comparable接口并不要求 compareTo() “与equals()一致”(尽管强烈建议)。 我错过了什么? 似乎新的实现允许HashMap违反Map接口的要求,如果密钥恰好具有兼容但非推荐的Comparable实现。 以下JUnit测试在OpenJDK 8u72上公开此行为: import static org.junit.Assert.*; import java.util.HashSet; import java.util.Set; import org.junit.Test; class Foo implements Comparable // Comment this out to fix the test case { private final int bar; private final int baz; Foo(int bar, int baz) { this.bar = bar; this.baz = baz; } […]

使用常规HashMap双重检查锁定

回到并发。 到目前为止,很明显,对于double checked locking ,变量需要声明为volatile 。 但是,如果使用双重检查锁定,如下所示。 class Test { private final Map map = new HashMap(); public B fetch(A key, Function loader) { B value = map.get(key); if (value == null) { synchronized (this) { value = map.get(key); if (value == null) { value = loader.apply(key); map.put(key, value); } } } return value; } […]

HashMap为什么以及如何拥有自己的hashCode()内部实现,称为hash()?

根据这篇博客文章 ,HashMap在已经检索到的哈希码上重新调用自己的hashCode() (称为hash() )。 如果key不为null,则会调用key对象的hashfunction,参见上面方法中的第4行,即key.hashCode(),所以在key.hashCode()返回hashValue后,第4行看起来像 int hash = hash(hashValue) 现在,它将返回的hashValue应用到它自己的散列函数中。 我们可能想知道为什么我们使用hash(hashValue)再次计算hashvalue。 答案是,它防御质量差的哈希>函数。 HashMap能否准确地重新分配哈希码? HashMap可以存储对象,但它无法访问为其分配hashCode对象的逻辑。 例如, hash()无法集成以下hashCode()实现背后的逻辑: public class Employee { protected long employeeId; protected String firstName; protected String lastName; public int hashCode(){ return (int) employeeId; } }