【Java】集合进阶——Set集合

简介: 【Java】集合进阶——Set集合

3.Set集合

   3.1Set集合概述和特点

  •    不包含重复元素的集合
  •    没有带索引的方法,所以不能使用普通for循环遍历

   3.2哈希值

  哈希值:是JDK根据对象的地址或字符串或者数字算出来的int类型的数值

 

   Object类中有一个方法可以获取对象的哈希值

  •    public int hashCode():返回对象的哈希码值

   对象哈希值的特点

  •    同一个对象多次调用hashCode()方法返回的哈希值是相同的
  •    默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同。

 3.3HashSet集合概述和特点

   HashSet集合的特点

  •    底层数据结构是哈希表
  •    对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致。
  •   没有带索引的方法,所以不能使用普通for循环遍历。
  •    由于是Set集合,所以是不包含重复元素的集合

 

   3.4HashSet集合保证元素唯一性源码分析

 HashSet集合添加一个元素的过程:

HashSet集合存储元素:

要保证元素唯一性,需要重写 hashCode()equals()

3.5常见数据结构之哈希表

   

哈希表在存储数据的时候,首先让哈希值对16取余,余数相同比较哈希值,不同就存入相应位置,相同则继续比较数据内容,不同就存入相应位置,相同则不进行存储。

3.6LinkedHashSet集合概述和特点

   LinkedHashSet集合的特点

  •    哈希表和链表实现的Set接口,具有可预测的迭代次序。
  • 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的。
  •    由哈希表保证元素唯一,也就是说没有重复的元素。

   

   3.7TreeSet集合概述和特点

 TreeSet集合特点:

  •    元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法

TreeSet():根据其元素的自然排序进行排序

       TreeSet(Comparator comparator):根据指定的比较器进行排序

  •    没有带索引的方法,所以不能使用普通for循环遍历
  •  由于是Set集合,所以不包含重复元素的集合

 

   3.8自然排序Comparaable的使用

  •    存储学生对象并遍历,创建TreeSet集合使用 无参构造方法
  •  要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

   

   结论:

  •    用TreeSet集合存储自定义对象时,无参构造方法使用的是 自然排序对元素进行排序的。


  • 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法
  •    重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。

 

   3.9比较器排序Comparator的使用

  •  存储学生对像并遍历,创建TreeSet集合使用 带参构造方法
  •    要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序。

 

   结论:

  •  用TreeSet集合存储自定义对象,带参构造方法使用的是 比较器排序对元素进行排序的。
  •    比较器排序,就是 让集合构造方法接收Comparator的实现类对象,重写comparae(To 1,To 2)方法
  • 方法
  •    重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。
目录
相关文章
|
1天前
|
存储 前端开发 Java
深入探索Java集合框架:核心组件与高效应用
深入探索Java集合框架:核心组件与高效应用
|
1天前
|
存储 算法 Java
Java数组与集合的深入解析
Java数组与集合的深入解析
7 0
|
1天前
|
存储 安全 Java
|
1天前
|
存储 安全 Java
Java中的线程安全集合
【5月更文挑战第30天】在多线程环境下,为了保证数据的一致性和完整性,我们需要使用线程安全的集合。本文将介绍Java中常用的线程安全集合及其使用方法。
|
2天前
|
存储 安全 Java
Java的集合框架
Java的集合框架
|
2天前
|
存储 安全 Java
Java list set map等接口及其实现类
Java list set map等接口及其实现类
|
3天前
|
编解码 安全 算法
Java多线程基础-18:线程安全的集合类与ConcurrentHashMap
如果这些单线程中的集合类确实需要在多线程中使用,该怎么办呢?思路有两个: 最直接的方式:使用锁,手动保证。如多个线程修改ArrayList对象,此时就可能有问题,就可以给修改操作进行加锁。但手动加锁的方式并不是很方便,因此标准库还提供了一些线程安全的集合类。
21 4
|
3天前
|
安全 Java 容器
Java 多线程系列Ⅶ(线程安全集合类)
Java 多线程系列Ⅶ(线程安全集合类)
|
Java
java中Set,Map,Stack一些简单用法
1 import java.util.Iterator; 2 import java.util.Stack; 3 import java.io.*; 4 import java.util.
615 0