HashSet理解(一)java集合

HashSet理解(一)java集合
HashSet理解(二)怎么做到值不重复
HashSet理解(三)add方法(jdk1.7及以前)是如何插值的
HashSet理解(四)为什么jdk1.7中的头插法会形成环和死循环?

《Java开发实战经典》这本书中,第13章,详细介绍了Java的容器。

java的容器分为两大类:集合(Collection)和映射(Map)。

为什么映射会翻译为Map?

映射的标准翻译是mapping, map的本意是地图,可以理解为地图上每一个点,都对应着现实中的一个地方。

映射中不同的key,能否对应同一个value?
先看看映射的数学定义:

两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素a,B中总有唯一的一个元素b与它对应,就这种对应为从A到B的映射,记作f:A→B。

这个定义仍然是不清晰的,列出几道数学题,直观的看看到底什么是映射。

从第一个映射可以看到,B集合中的元素1,并没有被指向,说明B集合中的元素可以多余。

从这两个题目中可以看出映射中不同的key,可以对应同一个value。所以,HashMap中的value值是可以重复的。

HashSet与ArrayList的区别是什么?

  • HashSet是无序的,遍历输出结果顺序可能与插入顺序不同。ArrayList是有序的,遍历输出结果顺序和插入顺序相同。
  • HashSet存储的对象,不能重复。ArrayList可以重复。
  • ArrayList可以根据index取出某一个值,但是HashSet不可以。

HashSet为什么不常用?

  • 无序性,HashSet中对象的存储,在jdk1.7及以前是数组+链表,并不是先行的。所以取对象的顺序,和插入顺序无关。
  • 不能像ArrayList那样,用fori循环根据index取出某一个值。

HashSet是线程安全的吗?

不是。set接口的三个实现类:HashSet、TreeSet、LinkedHashSet都不是线程安全的。要实现set的线程安全,有两种方式:

  • Set<String> synSet = Collections.synchronizedSet(new HashSet<>());
  • Set<String> copySet = new CopyOnWriteArraySet<>();

关于set的线程安全,参考:Java并发编程之set集合的线程安全类你知道吗

Java集合容器面试题(2020最新版)

おすすめ

転載: blog.csdn.net/zhangjin1120/article/details/121044722