当前位置: 首页 > news >正文

临时文档3

Set接口

说一下 HashSet 的实现原理?

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

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()指的是值是否相同

HashSet与HashMap的区别

Queue

BlockingQueue是什么?

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

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

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

代码示例:

Queue<String> queue = new LinkedList<String>();
queue. offer("string"); // add
System. out. println(queue. poll());
System. out. println(queue. remove());
System. out. println(queue. size());

http://www.lryc.cn/news/116993.html

相关文章:

  • 【OpenGauss源码学习 —— 执行算子(SeqScan算子)】
  • Postman中,既想传递文件,还想传递多个参数(后端)
  • 跨境干货|TikTok变现的9种方法
  • Grafana 曲线图报错“parse_exception: Encountered...”
  • idea中提示Unsupported characters for the charset ‘ISO-8859-1‘
  • 通过signtool进行数字签名和验证签名
  • geeemap学习总结(2)——地图底图应用
  • flutter 手写日历组件
  • C++动态规划经典试题解析之打家劫舍系列
  • 24届近5年东南大学自动化考研院校分析
  • electron、electron-forge 安装
  • go的strings用法
  • echo用法、linxu课堂练习题、作业题
  • WordPress使用【前端投稿】功能时为用户怎么添加插入文章标签
  • 第二章:CSS基础进阶-part1:CSS高级选择器
  • js 正则表达式 限制input元素内容必须以abc开头,123结尾
  • Linux下安装nginx (tar解压版安装)
  • 不同组件之间相互传递信息的方式(拓展知识)
  • idea找不到DataBase
  • 研发工程师玩转Kubernetes——PVC使用Label和storage选择PV
  • 【VUE】localStorage、indexedDB跨域数据操作实战笔记
  • 四、web应用程序技术——HTTP
  • B2B2C小程序商城系统--跨境电商后台数据采集功能开发
  • Python-OpenCV中的图像处理-形态学转换
  • 理解 Python 的 for 循环
  • 携程验证码
  • 资深媒体人宋繁银加入《数据猿》任总编辑,全面负责公司整体内容工作
  • 【Unity实战100例】人物状态栏UI数据刷新—MVC观察者模式
  • 8路AD采集FMC子卡【产品资料】
  • 文章三:团队协作实践 - 协作高手:Git团队开发最佳实践