HashSet
List 接口 不唯一 有序
下面实现类为 ArrayList Vector LinkList
Set 接口 唯一 无序(无序不等于随机)
没有跟索引相关的方法 无法使用普通for循环遍历
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Student {
private int age;
private String name;
}
基本数据类型会重写toString 方法
package com.msb.HashSet; import java.util.HashSet; /** * @author lcc * @version V1.0 * @Package com.msb.HashSet * @date 2022/4/24 10:32 */ public class StudentTesty { public static void main(String[] args) { HashSet<Student> hashSet = new HashSet<>();//这里我用的是lombok 注解自动重写了equals和hash hashSet.add(new Student(21,"lili")); hashSet.add(new Student(11,"lili")); hashSet.add(new Student(31,"lili")); hashSet.add(new Student(41,"lili")); hashSet.add(new Student(51,"lili")); System.out.println(hashSet);//value值相同不影响 System.out.println("------------------"); hashSet.clear(); hashSet.add(new Student(11,"zhangsan")); hashSet.add(new Student(11,"lili")); hashSet.add(new Student(11,"lisi")); hashSet.add(new Student(11,"wangwu")); hashSet.add(new Student(11,"zhaoliu")); System.out.println(hashSet);//相同的key 也能添加 System.out.println("----------------------"); hashSet.clear(); hashSet.add(new Student(11,"zhangsan")); System.out.println(hashSet.add(new Student(11, "lili"))); System.out.println(hashSet.add(new Student(11, "lili"))); hashSet.add(new Student(11,"wangwu")); hashSet.add(new Student(11,"zhaoliu")); System.out.println(hashSet);//当key和value 都相同时 只能插入一个 也是第一个插入成功 第二个插入失败 } }
hashset底层是数组
基本数据类型都有调用了hashCode方法计算出的hash值 在放入底层数组中
因为引用数据类型没有重写hashcode 方法 所以不会有唯一性



通过hash 值和一个底层表达式计算 数组中存放的位置的索引 也就是底层数组中的索引

当hashcode 值不同 那么认为是不同的元素 但是若经过表达式计算出的结果相同
那么会在对应底层数组锁对应的索引哪里生成链表,将相同索引的数据放入链表中
但是如果hashcode相同,那么必定是同一个元素 那么经过表达式后肯定索引会相同
那么这个元素就不会放入底层数组 equals方法判断


引用数据类型一定要重写以上两个方法 才能保证hashset 数据唯一

浙公网安备 33010602011771号