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

网站建设网站软件有哪些内容seo技巧课程

网站建设网站软件有哪些内容,seo技巧课程,爱趣网,wordpress 直播网站引言 Java开发经常需要借助各种集合类,常用的集合有List、Set和Map。Map存放的是key-value形式的数据,List与Set直接存放数据。List与Set的显著区别是,List中的数据是有序、可重复,而Set中的数据无序且不可重复。那么Set是如何实现…

引言

Java开发经常需要借助各种集合类,常用的集合有List、Set和Map。Map存放的是key-value形式的数据,List与Set直接存放数据。List与Set的显著区别是,List中的数据是有序、可重复,而Set中的数据无序且不可重复。那么Set是如何实现数据的不可重复插入,本文以HashSet为例,分析HashSet是如何实现元素不可重复。

一、引入场景

首先,我们定义一个学生对象,包含简单的两个属性:学号(id)与姓名(name)。只要id相同,就认为对象是重复的。

  1. public class Student {
  2. private Integer id;
  3. private String name;
  4. public Student(Integer id, String name) {
  5. this.id = id;
  6. this.name = name;
  7. }
  8. @Override
  9. public String toString() {
  10. return "Student{" +
  11. "id=" + id +
  12. ", name='" + name + '\'' +
  13. '}';
  14. }
  15. }
测试程序中,创建一个HashSet,向Set中插入两个Student对象,Student对象的内容完全相同。

  1. public class HashSetDemo {
  2. public static void main(String[] args) {
  3. Set<Student> set = new HashSet<>();
  4. Student student1 = new Student(1001,"young");
  5. Student student2 = new Student(1001,"young");
  6. set.add(student1);
  7. set.add(student2);
  8. set.forEach(student -> System.out.println(student));
  9. }
  10. }
运行程序,得到的结果如下


看到这个结果应该很惊讶,我们期望的是Set中存放的数据不可重复,而代码里的两个Student对象,学号与姓名都相同,插入到HashSet中后应该只保留一个对象。问题出在了哪里?要想找出原因,只有去源码里寻找答案。

二、HashSet源码分析

阅读HashSet的源码,可以发现HashSet的源码逻辑很简单。只有两个field,分别为HashMap类型的map和一个傀儡对象PRESENT。

  1. public class HashSet<E>
  2. extends AbstractSet<E>
  3. implements Set<E>, Cloneable, java.io.Serializable
  4. {
  5. static final long serialVersionUID = -5024744406713321676L;
  6. private transient HashMap<E,Object> map;
  7. // 傀儡对象,只是用来作为空的value值
  8. private static final Object PRESENT = new Object();
  9. /**
  10. * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
  11. * default initial capacity (16) and load factor (0.75).
  12. */
  13. public HashSet() {
  14. map = new HashMap<>();
  15. }
  16. //...
  17. }
Hashset的默认构造函数,为map字段实例化一个HashMap类型的对象。对于 HashSet,最主要就是add()方法,我们看一下add方法的源码。

  1. public boolean add(E e) {
  2. return map.put(e, PRESENT)==null;
  3. }
原来,HashSet是将数据存放到HashMap的Key中!前文有提到,HashMap是key-value形式的数据结构,它的key是唯一的。而HashSet原理就是利用HashMap key唯一的特点。此时,我们并没有解决自定义的Student对象插入到HashSet中不能保证不重复的问题,但已经定位到了问题的真正根源。HashMap中如何实现key的唯一性?

三、浅析HashMap

HashMap的设计十分精巧,本文不作深入分析,只简要描述HashMap的原理。HashMap的结构是一个哈希数组,数组节点在数组中的下标由节点的哈希值决定。了解哈希数组的同学都知道,不同元素的哈希映射有可能是相同的,意味着两个完全不同的节点映射到相同的数组下标上。HashMap并不对映射到相同位置上的节点二次散列,而是将节点放在已有节点的尾端。因此,数组节点的类型实际上是一个链表结构。


了解了HashMap的数据结构后,就能明白HashMap中有两个主要的判断。当key-value键值对插入到HashMap中。

首先是对key值哈希,得到key在哈希数组中的下标。HashMap中哈希是调用对象key的hashCode()方法,然后再做异或处理。

如果当前下标上已经有值,说明有两个元素的映射到相同的下标。此时,需要第二次判断,调用key对象的equals方法,对象不相同则插入链表的表尾,对象相同则覆盖。

四、验证

根据前面的分析,改造我们定义的Student类,为Student类增加hashCode()与equals()方法。

  1. public class Student {
  2. private Integer id;
  3. private String name;
  4. public Student(Integer id, String name) {
  5. this.id = id;
  6. this.name = name;
  7. }
  8. @Override
  9. public String toString() {
  10. return "Student{" +
  11. "id=" + id +
  12. ", name='" + name + '\'' +
  13. '}';
  14. }
  15. @Override
  16. public boolean equals(Object o) {
  17. if (this == o) return true;
  18. if (o == null || getClass() != o.getClass()) return false;
  19. Student student = (Student) o;
  20. return id.equals(student.id);
  21. }
  22. @Override
  23. public int hashCode() {
  24. return id.hashCode();
  25. }
  26. }
再次运行测试程序,结果如下:


此时,HashSet中只有一个对象。

转载: https://blog.csdn.net/veYoung/article/details/72420317

http://www.lbrq.cn/news/2681677.html

相关文章:

  • 网站技术制作流程图冯站长之家
  • 企业微网站爱站网站seo查询工具
  • 横岗网站建设多少钱网络推广公司哪家好
  • 网站搜索不出来怎么进行seo
  • 网站目录 index营销宣传方式有哪些
  • 大兴快速网站建设哪家好在线培训考试系统
  • 网站建设违法行为网站建设与管理属于什么专业
  • 网站上图怎么用ps做百度推广系统营销平台
  • 做网站公司汉狮团队app投放推广
  • 如何做p2p网站网络推广员要怎么做
  • 简单网站建设seo优化文章网站
  • 软文营销把什么放在第一位沈阳seo公司
  • wordpress 文本小工具编辑器windows优化大师免费
  • 营销型企业网站分析与诊断快速排名生客seo
  • 网站建设需求说明百度网盘链接
  • 手机百度搜索重庆seo服务
  • 二手设备回收做哪个网站好北京专业网站优化
  • 网站如何做优化排名靠前磁力下载
  • 网站制作滚动图片怎么做广告联盟怎么赚钱
  • 你好南京网站怎么做好推广和营销
  • 静态网站源码下载搜索引擎营销成功案例
  • 网站建设深圳公司搜索营销
  • 中国互联网协会副会长名单百度seo规则最新
  • 做外汇看新闻在什么网站看举出最新的网络营销的案例
  • 中英文网站建设需要懂英语吗广州中小企业seo推广运营
  • 淘宝客网站域名聊城今日头条最新
  • 河南省建设工程网站镇江seo优化
  • 宁波奉化建设局网站榜单优化
  • 重庆南坪网站建设临沂seo顾问
  • 房地产楼盘微信网站建设营销方案开网站需要多少钱
  • 【Redis在在线表单提交防重复机制中的应用策略】
  • 电子电气架构 --- 软件定义汽车的驱动和挑战
  • 云原生环境 Prometheus 企业级监控实战
  • 工业相机与智能相机的区别
  • Vue.js设计于实现 - 概览(二)
  • windows上LM-Studio下载安装教程