之前在《java常用对象API之集合框架》这篇文章中已经将所有集合框架做了一个总体的大纲陈列,并阐述了所有Collection接口下的子接口和类的作用解释,那么接下来的文章智言还是想把里面的一些比较难的接口和类进行一个剖析,让各位新加入学习java的朋友可以得以启发,并激情的继续往java这条路上走的更远。

HashSet是Set接口下的一个类,它的内部数据结构是哈希表 ,是不同步的。

既然HashSet是不同步的,那么如何来保证该集合的元素唯一性呢?

是通过对象的hashCode和equals方法来完成对象唯一性的。

如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。

如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true,如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

例如:

1.首先建立Person类

public class Person{

private String name;

private int age;

public Person(String name, int age){

super();

this.name=name;

this.age=age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

2.然后建立主函数HashSetDemo类

public class JavaDemo{

public static void main(String[] args){

HashSet hs = new HashSet();

hs.add(new Person(“张三”,21));

hs.add(new Person(“李四”,23));

hs.add(new Person(“王五”,22));

hs.add(new Person(“麻子”,24));

Iterator it = hs.iterator();   //创建迭代器

while(it.hasNext()){

Person p = (Person)it.next();   //由于it的next()方法是继承的Object类,所以这里需要强制转换成Person类型

System.out.println(p.getName()+”…”+p.getAge());

}

}

}

3.显示结果:

张三….21

王五….23

麻子….24

李四….22

上面的例子只是指出了HashSet的具体作用展现,但是它是如果在底层进行工作的呢?这个时候就需要讲到HashCode和equals这个两个方法的作用。

那么我们还是用例子来简单讲解一下,首先我们在上面例子中主函数HashSetDemo类里再加入一段代码

hs.add(new Person(“李四”,22));

即主函数HashSetDemo类中有两个一模一样的hs.add(new Person(“李四”,22));对象,那么很明显,最后的显示结果肯定会是:

张三….21

王五….23

麻子….24

李四….22

李四….22

答案是肯定的,因为Person类默认继承了Object类,所以实现了Object类里的hashCode方法,这样就没有体现出HashSet中hashCode和equals这两个方法的一个价值,那么我们来慢慢讲解一下。

其实HashSet这个类就像最上面讲的如果对象的hashCode值不同,那么不用判断equals方法,就直接存储到哈希表中。如果对象的hashCode值相同,那么要再次判断对象的equals方法是否为true,如果为true,视为相同元素,不存。如果为false,那么视为不同元素,就进行存储。

4.那么这个时候我们可以重写hashCode和equals这两个方法来验证HashSet的底层运行流程。

我们首先在Person类里添加hashCode和equals这两个方法:

public int hashCode(){

System.out.println(this+”…hashCode”);

return name.hashCode()+age;

}

public boolean equals(Object obj){

System.out.println(this+”…equals…”+obj);

Person p = (Person)obj;

return this.name.equals(p.name)&&this.age==p.age;

}

另外为了看的更明白一点,我把toString方法也重写一样:

public String toString(){

return name+”:”+age;

}

这个时候再运行主函数会显示:

张三:21…hashCode

李四:22…hashCode

王五:23…hashCode

麻子:24…hashCode

李四:22…hashCode

李四:22…equals…李四:22

张三….21

李四….22

王五….23

麻子….24

那么上面红色显示的就是使用了自定义hashCode和equals后具备了唯一性的HashSet表现形式

记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。一般情况下,如果定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。建立对象判断是否相同的依据。

hashset java api_java常用对象API中集合框架之HashSet相关推荐

  1. java api 框架_java常用对象API之集合框架

    说到集合框架,其实刚开始学的时候有点自我感觉很简单,自己认为就是集合类中的框架之类的,但是当自己简单把它过了一变后发现懵里懵懂的,什么都没懂,于是自己又认认真真的看了一遍,才弄明白. 说到集合框架就不 ...

  2. java+@api_Java 常用的api

    ## 常用的api ## #### 1.概述 #### > API(Application ProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与 ...

  3. Java基础知识之什么是集合框架

    Java基础知识之什么是集合框架,前面的文章,我们已经学习了Java的一些基础知识,比如泛型.注解等等内容,接着本博客继续学习Java中一个很常见的内容,集合. 1.什么是Java中的集合框架? Ja ...

  4. hashset java 键值对_Java中的各个容器的性能对比

    java中个个容器的属性,性能,参数对比: Java容器的性能及属性的对比 List:Vector,ArrayList,LinkedList Vector:内部是数组数据结构,可以理解为加锁的Arra ...

  5. java程序中集合框架有哪些

    作者:代码界的小白 链接:Java中集合在面试中的高频考点_技术交流_牛客网 来源:牛客网 本章节主要分享一些Java中的集合在面试中常问的高频问题,这里给出的是相对比较简略的答案,不过针对面试的回答 ...

  6. java SE常用的API和一些常用Test

    Day01(回文,验证码) Test01: 1:输出字符串"HelloWorld"的字符串长度 str.length(); 2:输出"HelloWorld"中& ...

  7. java criteria or_java-JPA Criteria API中的比较日期实体

    将JPA 2与EclipseLink实现一起使用. 我正在尝试建立一个动态查询,该查询应该使我在给定日期后仍保留一些记录. CriteriaBuilder builder = em.getCriter ...

  8. java list 差集_Java基础之集合框架

    Java 集合框架概述 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器 ...

  9. Java【7】工具包(集合框架、函数式编程、Optional容器)

    目录 1.集合与Collection集合接口 2.List集合接口 3.LinkedList分析 4.Map接口及其操作 5.HashMap 6.Set集合接口 7.Iterator接口 8.小结:J ...

最新文章

  1. VS2013 编译程序时提示 无法查找或打开 PDB 文件
  2. 【采用】【风险管理】(第一篇)风险管理核心指标
  3. mysql计算后精度增大_Mysql用法汇总
  4. 一个容易忽略的问题—Javascript文件加载的顺序
  5. 响应式布局方法的方法
  6. C++ 输出调试信息 类似MFC的TRACE等宏
  7. Mr.J-- jQuery学习笔记(十五)--实现页面的对联广告
  8. Java基础-hashMap原理剖析
  9. 高并发秒杀系统--Service事务管理与继承测试
  10. 微软删除最大的公开人脸识别数据集,只因员工离职?!
  11. lsof查找放进linux回收站中的删除文件,并彻底删除或恢复文件
  12. python 菜鸟-Python3 面向对象
  13. 10. Django基础:静态文件
  14. CodeForces 2B The least round way
  15. html css的参考文献,网页制作论文参考文献大全 网页制作参考文献有哪些
  16. html link 怎么设置密码,tplink路由器手机怎么设置密码?
  17. [矩阵论]欧氏空间的线性变换是正交变换的充要条件是,它对于标准正交基的矩阵是正交矩阵
  18. [Java]-单例模式与volatile简介
  19. 快速了解使用ncurses(按键的快速响应)
  20. 人工智能笔记 2.1人工智能导论- 1.什么是AI,深度优先,广度优先,最优路径

热门文章

  1. firebase连接不上_如何在Firebase上托管Blazor应用程序
  2. 如何在TensorFlow中通过深度学习构建年龄和性别的多任务预测器
  3. 浅层学习与深层学习_深层副本与浅层副本-以及如何在Swift中使用它们
  4. 123_Power PivotPower BI DAX函数说明速查
  5. Stateflow如何观察变量的变化
  6. 10个必会的 PyCharm 技巧,附高清大图
  7. pycharm中的数据库可视化
  8. ASP.NET 操作Cookie详解 增加,修改,删除
  9. java向Oracle数据库中插入blob字段数据
  10. Linux 服务器高级编程ET LT代码