当前位置 : 主页 > 编程语言 > java >

Java Set常见面试题

来源:互联网 收集:自由互联 发布时间:2023-09-03
Java集合面试之Set篇 有 List 了为什么还要有 Set?Java 容器 Set 的核心通关指南 主要有HashSet、LinkedHashSet、TreeSet HashSet (无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素 Linke

Java集合面试之Set篇

有 List 了为什么还要有 Set?Java 容器 Set 的核心通关指南

主要有HashSet、LinkedHashSet、TreeSet

  • HashSet(无序,唯一): 基于 HashMap 实现的,底层采用 HashMap 来保存元素
  • LinkedHashSet: LinkedHashSetHashSet 的子类,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的 LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的
  • TreeSet(有序,唯一): 红黑树(自平衡的排序二叉树)

1、HashSet 的实现原理?

HashSet 是基于HashMap实现的,HashSet的值存放于HashMap的key上,HashMap的value统一为静态对象PRESENT,因此 HashSet 的实现比较简单,相关 HashSet 的操作,基本上都是直接调用底层 HashMap 的相关方法来完成,HashSet 不允许重复的值。

2、HashSet如何保证唯一性?

1).HashSet底层数据结构是哈希表,哈希表就是存储唯一系列的表,而哈希值是由对象的hashCode()方法生成。

2).确保唯一性的两个方法:hashCode()equals()方法。

3、LinkedHashSet如何保证有序和唯一性?

1).底层数据结构由哈希表和链表组成。

2).链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性。

4、TreeSet如何保证元素的排序和唯一性?

底层的数据结构是红黑树(一种自平衡二叉查找树)。

JDK 1.8中为什么HashMap使用红黑树而不是普通的AVL树

5、HashSet、TreeSet 和 LinkedHashSet 三种类型什么时候使用它们?

(1)HashSet中不能有相同的元素,可以有一个Null元素,存入的元素是无序的。

(2)LinkedHashSet中不能有相同元素,可以有一个Null元素,元素严格按照放入的顺序排列。

(3)TreeSet是中不能有相同元素,不可以有Null元素,根据元素的自然顺序进行排序。

无排序要求可以选用HashSet;想取出元素的顺序和放入元素的顺序相同,那么可以选用LinkedHashSet。想插入、删除立即排序或者按照一定规则排序可以选用TreeSet。

6、HashSet 和 LinkedHashSet 判定元素重复的原则是相同的?

是的,会先去执行 hashCode() 方法,判断是否重复。如果 hashCode()返回值相同,就会去判断 equals 方法。如果equals() 方法还是相同,那么就认为重复。

7、TreeSet 判断元素重复原则?

TreeSet 的元素必须是实现了 java.lang.Comparable<T> 接口,所以他是根据此接口的方法 compareTo 方法进行判断重复的,当返回值一样的时认定重复。

8、怎么实现一个线程安全的 hashset?

Collections.synchronizedSet()

or

CopyOnWriteArraySet

9、CopyOnWriteArraySet 的实现?

是一个支持并发访问的容器,CopyOnWriteArraySet是借助CopyOnWriteArrayList实现的,只不过CopyOnWriteArraySet是在CopyOnWriteArrayList上使用indexOf不允许存入重复元素。

10、EnumSet是什么?

是枚举类型的集合实现。是不同步的,不允许值为null的元素。

11、HashSet和TreeSet的区别两者主要在实现方式、数据是否有序以及是否可以放入null值等三方面存在区别?

一、实现方式

  • HashSet是哈希表实现的。
  • TreeSet是二叉树实现的。

二、数据是否有序

  • HashSet中的数据是无序的。
  • TreeSet中的数据是自动排好序的。

三、是否可以放入null值

  • HashSet可以放入null,但只能放入一个null。
  • TreeSet不允许放入null值。
上一篇:Java入门(01):认识Java
下一篇:没有了
网友评论