JAVA — Set

1.1 Set集合概述

不包含重复元素的集合;

没有带索引的方法,所以不能用普通的 for 循环遍历;

1.2 哈希值

哈希值:

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

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

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

对象的哈希值特点:

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

1.3 HashSet 集合

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

通过 foreach 循环可进行遍历;

示例:

java 对id哈希 java的哈希值是什么_链表

1.3.3 HashSet 集合添加一个元素的过程
  1. 调取对象的 hashCode() 方法获取对象的哈希值;
  2. 根据对象的哈希值计算对象的存储位置;
  3. 该位置是否有元素存在:

3.1 没有:

将元素存储到该位置;

3.2 有:

遍历该位置的所有元素,和新存入的元素比较哈希值是否相同

  • 都不相同:将元素存储到该位置;

  • 有相同的:调用 equals() 方法比较对象是否相等;

  • 相等:说明元素存在,不存入;
  • 不相等:将元素存储到该位置;

1.4 LinkedHashSet 集合

特点:

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

1.5 TreeSet 集合

特点:

  • 元素有序,不是按照存储跟取出的顺序,而是按照一定的规则进行排序;

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

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

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