1. HashSet 集合

   (1)HashSet 的概述

     HashSet 的底层数据结构是哈希表(哈希表是一个元素为链表的数组)。HashSet 不是线程安全的,集合元素可以是null。当向HashSet 中存入一个元素时,HashSet 会调用该对象的HashCode()方法来得到该对象的HashCode值,然后根据HashCode值决定该对象在HashSet 中的存储位置。

   (2)HashSet判断两个元素相等的标准:

     两个对象的HashCode值相等,并且两个对象的equals方法的返回值也相等。

代码演示:


import java.util.Objects;public class Person {private String name;private int age;public Person(String name, int age) {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;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
import java.util.HashSet;public class Test {public static void main(String[] args) {HashSet<Person> set = new HashSet<>();set.add(new Person("张三",21));set.add(new Person("张三",22));set.add(new Person("张三",21));System.out.println(set);}
}

执行结果:

重写了HashCode和equals方法后才能保证对象元素的唯一性。

2. LinkedHashSet 集合

   (1)概述

      LinkedHashSet 是底层数据是链表和哈希表。链表保证了数据的有序性,哈希表保证了数据的唯一性。

   (2)特点:LinkedHashSet的存储顺序和取出的顺序是一样的,它是线程不安全的集合,运行速度快。

3. TreeSet 集合

   (1)概述

      TreeSet 集合继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
      TreeSet基于TreeMap实现的。TreeSet中含有一个”NavigableMap类型的成员变量”m,而m实际上是”TreeMap的实例”。 底层的数据结构是红黑树(平衡二叉树)。

   (2)特点

     存入的元素唯一并且可以对元素排序。
     排序方式有两种:自然排序和比较器排序。
     如果要使用自然排序,那么对其中元素就要求实现Comparable 接口。

代码演示:

package com.westos.demo;import java.util.Objects;public class Person implements Comparable<Person>{private String name;private int age;public Person(String name, int age) {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;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic int compareTo(Person p) {int num  = this.age-p.age;int num2 = num==0?this.name.compareTo(p.name):num;return num2;}
}package com.westos.demo;import java.util.TreeSet;public class Test1 {public static void main(String[] args) {TreeSet<Person> set = new TreeSet<>();set.add(new Person("张三",25));set.add(new Person("李四",21));set.add(new Person("王五",23));set.add(new Person("王五",28));for (Person person : set) {System.out.println(person);}}
}

不写排序的异常:

执行结果:

4. HashCode和equals方法的面试题

   ● 问题: 如果两个对象的哈希值相同 p1.hashCode()==p2.hashCode() , 两个对象的equals一定返回true吗 p1.equals(p2) 一定是true吗?

   正确答案:不一定

   ● 如果两个对象的equals方法返回的结果为true,两个对象的哈希值一定相同吗?

   正确答案:一定

在 Java 应用程序执行期间,
1.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
2.如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。

两个对象不同(对象属性值不同) equals返回false=====>两个对象调用hashCode()方法哈希值相同

两个对象调用hashCode()方法哈希值不同=====>equals返回true

所以说两个对象哈希值无论相同还是不同,equals都可能返回true

JavaSE基础———Set接口中的常用类HashSet、LinkedHashSet和TreeSet相关推荐

  1. JAVASE学习笔记 Java中的常用类--StringBuffer类、StringBuilder类

    1.StringBuffer类概述 在Java中我们如果对字符串进行拼接操作,每次拼接都能构建一个新的String对象,这样操作既费时有浪费时间,StringBuffer类就能解决这个问题. Stri ...

  2. JAVA基础(12.Java中的常用类String)

    目录 1.前言 2.日期(时间)相关类 2.1 日期类的应用场景 2.1.1Java中的日期相关的几个类 3. Java中的常用类学习方式 3.1 什么是常用类?为什么要学习? 3.2 怎么使用Jav ...

  3. JavaSE学习总结(八)常用类(上)Object类==与equals方法的区别浅克隆的特点Scanner类String类String两种创建对象方式的区别String类的各种功能

    JavaSE学习总结(八)常用类(上)/Object类/==与equals方法的区别/浅克隆的特点/Scanner类/String类/String两种创建对象方式的区别/String类的各种功能 常用 ...

  4. [C++基础]队列queue中的常用函数

    [C++基础]队列queue中的常用函数 本博客转载自:https://www.cnblogs.com/xuning/p/3321733.html 在C++中只要#include即可使用队列类,其中在 ...

  5. JAVASE基础模块十五(StringBuffer类)

    JAVASE基础模块十五(StringBuffer类) public class Stbuffer { public static void main(String[] args) { //总共创建五 ...

  6. JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet

    详解Set集合中实现类:LinkedHashSet以及TreeSet 1.LinkedHashSet概述 2.TreeSet概述 2.1 自然排序 2.1.1 TreeSet存储常见引用数据类型 2. ...

  7. DIDAO.Common --- 项目中的常用类及其中函数

    DIDAO.Common --- 项目中的常用类及其中函数 常用函数: CommonHelper.cs using System; using System.Collections.Generic; ...

  8. JavaEE基础第9章Java常用类

    第9章Java常用类 字面量的定义方式都是存在常量池中的,常量池中不会存储多个一样的字符串,在定义一个字符串的时候会先去常量池中找有没有存在的,有就将地址传过去,没有就新建. String字符串 概念 ...

  9. java 参数代替所有类_Java中的常用类

    1      常用类NO13 [ Int    Interger short  Short byte   Byte double Double float   Float Boolean Boolea ...

  10. QT入门基础认知(三个常用类、三种对话框类型、信号和槽)

    1.简单介绍: 1.1 三个常用类(Qwidget类.QDialog类.QMainwindow类) Qwidget类:继承与QObject类和QPaintdevice类,所有用户界面对象的基类,常用于 ...

最新文章

  1. 阿里原来是这么干的!Spring Boot 五种热部署方式
  2. 六款最热门微软机器学习工具,你值得拥有
  3. 安装.Net的痛苦经历!
  4. 完成users中的models
  5. FileZilla 连接不上虚拟机 ubuntu
  6. backbone.js入门
  7. Java技术分享:SpringBoot多模块开发
  8. BM39 序列化二叉树
  9. win7/WIN8.1(x64) 下使用MSDE WIN10不行
  10. Pipe HDU - 2150(判断线段相交+向量叉乘线代详解)
  11. 160 - 27 Cosh.1
  12. 「雕爷学编程」Arduino动手做(21)——激光开关模块
  13. NAT原理?代理服务器原理?
  14. java随机取数组_java基础自动数组(获取随机数组的最大数和最小数)
  15. 基于SSM框架开发的社区疫情管理系统 附带详细运行指导视频
  16. 汽车电子电气(E/E)构架变革
  17. MATLAB基础学习系列二——矩阵
  18. ctDNA早期肿瘤×××基因检测
  19. 《变量——本土时代的生存策略》(2021-2049)何帆/著 读后感
  20. Android开发 Studio4.0 APP logo 适配

热门文章

  1. [Codeforces 920E]Connected Components?
  2. docker[-compose] 连接内网其他容器地址
  3. VMware下Hadoop 2.4.1完全分布式集群平台安装与设置
  4. android中ListView的简单使用
  5. Object中Equals和ReferenceEquals不解之谜
  6. 程序员必知:平凡而又神奇的贝叶斯方法
  7. 拓端tecdat|R语言arima,向量自回归(VAR),周期自回归(PAR)模型分析温度时间序列
  8. 拓端tecdat|R语言时间序列TAR阈值自回归模型
  9. 拓端tecdat|在R语言中轻松创建关联网络
  10. python for a,b in c