Hazelcast 总是 returns null,containsKey 总是 return false
Hazelcast get always returns null, containsKey always return false
获得 started looking at Hazelcast (3.4.4)。最小配置。测试:
case class Ticket(id:Int, name:String)
val ticketCount = 20
val tickets:List[Ticket] = for { n <- (0 until ticketCount).toList } yield Ticket(n, s"ticket$n")
val map: IMap[Long, Ticket] = hz1.getMap[Long,Ticket]("com.foo.testmap")
tickets foreach { t =>
println(s"submitting $t")
Thread.sleep(10) // some delay to submit one ticket
map.putIfAbsent(t.id, t)
}
Thread.sleep(2000) // two seconds to make sure all is set..
var value1 = map.get(19) // null
var value2 = map.containsKey(19) ) // false
val value3 = map.getAsync(19).get() // Ticket(19,ticket19)
为什么null
,为什么false
,为什么只有map.getAsync(19).get()
有效?
不过,这个:
val iterator = map.entrySet().iterator() // will print all values
while(iterator.hasNext) {
val next = iterator.next()
println(next)
}
将打印所有条目。
更新:
在配置中:
<map name="com.foo.testmap">
<in-memory-format>OBJECT</in-memory-format>
</map>
当您将 var value1 = map.get(19)
更改为 var value1 = map.get(19l)
时,它会按预期工作
您在将数据存储到地图中时使用 Long 作为键。但是,您正在使用 Integer 取回数据。正如您在 IMap contract 中看到的,相等性比较使用键的二进制(序列化)形式,而不是键本身。显然,long 被序列化为与整数不同的二进制文件。
getAsync()
的工作方式与 get()
方法不同,它确实使用了泛型,我假设 Scala 编译器在幕后将密钥转换为 Long。
它是自动装箱和 Scala 编译器魔法的组合,创建了看似不一致的行为。但是,当我考虑它时,它并不是那么出乎意料。 j.u.Map
的行为完全相同。以下测试也失败了:
@Test
public void surpriseNotReally() {
Map<Long, String> map = new HashMap<>();
long key = 1;
String expectedValue = "foo";
map.put(key, expectedValue);
String actualValue = map.get(1);
assertEquals(expectedValue, actualValue);
}
获得 started looking at Hazelcast (3.4.4)。最小配置。测试:
case class Ticket(id:Int, name:String)
val ticketCount = 20
val tickets:List[Ticket] = for { n <- (0 until ticketCount).toList } yield Ticket(n, s"ticket$n")
val map: IMap[Long, Ticket] = hz1.getMap[Long,Ticket]("com.foo.testmap")
tickets foreach { t =>
println(s"submitting $t")
Thread.sleep(10) // some delay to submit one ticket
map.putIfAbsent(t.id, t)
}
Thread.sleep(2000) // two seconds to make sure all is set..
var value1 = map.get(19) // null
var value2 = map.containsKey(19) ) // false
val value3 = map.getAsync(19).get() // Ticket(19,ticket19)
为什么null
,为什么false
,为什么只有map.getAsync(19).get()
有效?
不过,这个:
val iterator = map.entrySet().iterator() // will print all values
while(iterator.hasNext) {
val next = iterator.next()
println(next)
}
将打印所有条目。
更新:
在配置中:
<map name="com.foo.testmap">
<in-memory-format>OBJECT</in-memory-format>
</map>
当您将 var value1 = map.get(19)
更改为 var value1 = map.get(19l)
您在将数据存储到地图中时使用 Long 作为键。但是,您正在使用 Integer 取回数据。正如您在 IMap contract 中看到的,相等性比较使用键的二进制(序列化)形式,而不是键本身。显然,long 被序列化为与整数不同的二进制文件。
getAsync()
的工作方式与 get()
方法不同,它确实使用了泛型,我假设 Scala 编译器在幕后将密钥转换为 Long。
它是自动装箱和 Scala 编译器魔法的组合,创建了看似不一致的行为。但是,当我考虑它时,它并不是那么出乎意料。 j.u.Map
的行为完全相同。以下测试也失败了:
@Test
public void surpriseNotReally() {
Map<Long, String> map = new HashMap<>();
long key = 1;
String expectedValue = "foo";
map.put(key, expectedValue);
String actualValue = map.get(1);
assertEquals(expectedValue, actualValue);
}