Set-Queue文章目录

  • 其他文章地址
  • 一、Set接口
    • 1.1、说一下 HashSet 的实现原理?
    • 1.2、HashSet如何检查重复?HashSet是如何保证数据不可重复的?
    • 1.5、HashSet与HashMap的区别
  • 二、Queue
    • 1.1、BlockingQueue是什么?
    • 1.2、在 Queue 中 poll()和remove()有什么区别?


其他文章地址

常考集合面试题(一)
常考集合面试题-List接口(二)
常考集合面试题之Set-Queue(三)
常考集合面试题之Map(四)
常考集合面试题-辅助工具(五)

一、Set接口

1.1、说一下 HashSet 的实现原理?

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

1.2、HashSet如何检查重复?HashSet是如何保证数据不可重复的?

HashSet 中add ()元素时,判断元素是否存在的依据,不仅要比较hash值,同时还要结合equles 方法比较。HashSet 中的add ()方法会使用HashMap 的put()方法。HashMap 的 key 是唯一的,由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V。所以不会重复( HashMap 比较key是否相等是先比较hashcode 再比较equals )。

以下是HashSet 部分源码:

private static final Object PRESENT = new Object();private transient HashMap<E,Object> map;public HashSet() {
  map = new HashMap<>();
 }

 public boolean add(E e) {
  // 调用HashMap的put方法,PRESENT是一个至始至终都相同的虚值
  return map.put(e, PRESENT)==null;
 }

hashCode()与equals()的相关规定:

  1. 如果两个对象相等,则hashcode一定也是相同的
  2. 两个对象相等,对两个equals方法返回true
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 综上,equals方法被覆盖过,则hashCode方法也必须被覆盖
  5. hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写
    hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对
    象指向相同的数据)。

==与equals的区别

  1. ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是相同
  2. 是指对内存地址进行比较 equals()是对字符串的内容进行比较
  3. 指引用是否相同 equals()指的是值是否相同

1.5、HashSet与HashMap的区别

HashMapHashSet
HashMap实现了Map接口HashSet实现了Set接口
HashMap储存键值对HashSet仅仅存储对象
使用put()方法将元素放入map中使用add()方法将元素放入set中
HashMap中使用键对象来计算hashcode值HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
HashMap比较快,因为是使用唯一的键来获取对象HashSet较HashMap来说比较慢
二、Queue

1.1、BlockingQueue是什么?

Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一个元素的时候,它会等待队列变为非空;当在添加一个元素时,它会等待队列中的可用空间。BlockingQueue接口是Java集合框架的一部分,主要用于实现生产者-消费者模式。我们不需要担心等待生产者有可用的空间,或消费者有可用的对象,因为它都在BlockingQueue的实现类中被处理了。Java提供了集中BlockingQueue的实现,比如ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue,、SynchronousQueue等。

1.2、在 Queue 中 poll()和remove()有什么区别?

  • 同点:都是返回第一个元素,并在队列中删除返回的对象。
  • 不同点:如果没有元素 poll()会返回 null,而 remove()会直接抛出NoSuchElementException 异常。