相关疑难解决方法(0)

Java HashMap如何使用相同的哈希代码处理不同的对象?

根据我的理解,我认为:

  1. 两个对象具有相同的哈希码是完全合法的.
  2. 如果两个对象相等(使用equals()方法),则它们具有相同的哈希码.
  3. 如果两个对象不相等,则它们不能具有相同的哈希码

我对么?

现在,如果我是正确的,我有以下问题:HashMap内部使用对象的哈希码.因此,如果两个对象可以具有相同的哈希码,那么它如何HashMap使用它所使用的键?

有人可以解释HashMap内部如何使用对象的哈希码吗?

java hash-function hashmap hashcode

205
推荐指数
9
解决办法
20万
查看次数

ConcurrentHashMap computeIfAbsent

现在没有在java 8的Javadoc推出了一个新的API computeIfAbsent 它的ConcurrentHashMap的impelementation状态:

如果指定的键尚未与值关联,则尝试使用给定的映射函数计算其值,并将其输入此映射,除非为null.整个方法调用是以原子方式执行的,因此每个键最多应用一次该函数.其他线程在此映射上的某些尝试更新操作可能在计算进行时被阻止,因此计算应该简短,并且不得尝试更新此映射的任何其他映射.

那么,在密钥已经存在且计算不需要的情况下,它对锁定此实现有什么看法呢?即使不需要计算,只是映射函数调用是同步的,以防止调用函数两次,整个方法computeIfAbsent是否如文档中所述同步?

java concurrency multithreading

14
推荐指数
2
解决办法
1万
查看次数

当两个线程试图在并发hashmap中放入相同的键值时会发生什么

想象一下,有两个线程A,B将分别在地图中放置两个不同的值,即v1和v2,具有相同的密钥.密钥最初不存在于映射中线程A调用containsKey并发现密钥不存在,但是立即挂起线程B调用containsKey并发现密钥不存在,并且有时间插入其值v2

当线程A回来时,会发生什么?我假设,它调用put方法反过来调用putIfAbsent但是密钥已经存在于线程B.so线程A将不会覆盖该值

但是从这个链接我发现线程A恢复并插入v1,"和平"覆盖(因为put是线程安全的)线程B插入的值 是ConcurrentHashMap完全安全吗?

java multithreading

2
推荐指数
1
解决办法
3584
查看次数

在这种情况下,ConcurrentHashMap 和 Synchronized Hash Map 哪个更好?

我正在编写一个使用 map 作为缓存存储的实用程序类。现在因为它将在多线程环境中使用。我想出了在执行 put 操作或 ConcurrentHashMap(使用 putIfAbsent)时使用同步哈希映射的用法,我仍然对它是否容易覆盖键值感到困惑(尽管键值在我的情况下是唯一的)并且两者都有利弊。所以我无法决定。可能还有其他一些缓存存储,我可以用于此目的,建议但我更想知道如果这是唯一的选择,将使用 CHM 或 Hashmap

在程序的评论中是 CHM 用法,我认为我已经使用了 HashMap。

public final class DateTime {

  private static final Map<CountryLanguage, Locale> localeMap = new HashMap<>();

 /*private static final Map<CountryLanguage, Locale> localeMap = new ConcurrentHashMap<>();*/

public static String getDateTime1(String pattern, LocalDateTime localDateTime, String language,
      String country) {
    if (language == null || language.isEmpty()) {
      throw new NullPointerException("Language cannot be null or empty");
    }
    CountryLanguage countryLanguage = new CountryLanguage(language, country);
    if (!localeMap.containsKey(countryLanguage)) {
      synchronized (localeMap) {
        // …
Run Code Online (Sandbox Code Playgroud)

java collections multithreading hashmap concurrenthashmap

0
推荐指数
1
解决办法
1670
查看次数