当前位置: 首页 > 网络应用技术

为什么允许contrenthashmap插入空值?

时间:2023-03-06 18:35:08 网络应用技术

  在Java语言中,contrenthashmap和hashtable的键(空)值异常,但是允许由单个线程操作的hashmap插入null(空)值,最终是为什么?

  1.探索源代码以找到原因,让我们看一下源代码的这样的段落,打开putval()concurrenthashmap的方法,源代码中的第一个句子很清楚。空指针异常。

  我们似乎已经在源代码中找到了原因。您可以这样回答采访者,说JDK源代码是如此的。但是,这个原因无法说服面试官。尽管源代码是这样设计的,但我们必须考虑设计背后的更深层原因。

  那么,为什么confurrenthashmap允许插入null(空)值,而hashmap允许再次插入?

  2.歧义性问题是模棱两可的,因为将null(空)值插入consurrenthashmap中。我们可以假设conturrenthashmap允许插入null(空)值,那么当我们获得值时,将出现两个结果:

  1.值不在集合中,因此返回的结果为null(空);

  2.值为null,因此结果是其原始零值。

  这引起了歧义的问题。

  然后hashmap允许插入空值,不是担心歧义吗?这是因为hashmap的设计用于单个线程,因此,如果获得了null(空)值,我们可以区分此null(空)值通过hashmap的containskey(键)方法。)或未返回的null值。

  contrenthashmap并不相同,因为confurrenthashmap用于多线程场景,其情况更为复杂。

  例如,现在T1调用ConcurrentHashMap的containskey(键)方法。我们希望结果能返回结果。也就是说,T1并未将null(空)值放在consurrenthashmap中。

  但是,发生了事故。在返回螺纹T1之前,线程T2称为contrenthashmap的put()方法,插入键,归属值为null。

  显然,这个结果与我们以前预期的错误完全不一致。

  换句话说,在多线程的复杂情况下,在我们多线程的复杂性下,它是由null(空)值插入的,或尚未返回的null(空)值。,无法证明产生的歧义,

  3.作者回答说,不允许插入contrenthashmap的零值的问题。有人问Concurrenthashmap的作者Doug Lea。以下是他回答的邮件内容:

  在呼叫之间更改。

  在少数设计的设计中,乔什(Josh Block)和我长期以来一直不同意。))))))))))))

  在我的整个应用程序中检查检查空键和值的检查是非常不同的。

  在静态最终对象null = new Object()的某个地方声明某个地方会更容易。并替换所有用于用零地图使用的nulls?

  -doug

  上面字母的主要含义是道格·利(Doug Lea)认为,这种设计的最重要原因是:宽容不容忍并发场景中的歧义!

  4.总结ConcurrentHashMap的设计,以添加不允许在源代码中插入null(空)值的设计。主要目的是防止并发场景中的歧义。

  以上是我的回答,为什么我不允许插入contrenthashmap上的null(空)值。对于了解的朋友,请注意它,并且下次不要迷路。

  本文最初是创建“ Tom Bullet Architecture”的。请指出重印的来源。技术在于共享,我分享我的幸福!如果本文对您有所帮助,请注意并喜欢;如果您有任何建议,也可以发表评论或私人消息。您的支持是我坚持创建的动力。关注微信公共帐户“ Tom Bullet Architecture”以获取更多技术干货!

  我是文学和艺术的汤姆

  原始:https://juejin.cn/post/70981739772803109