java.util.Set接口 extends Collection接口

Set特点:

1、不允许有重复的元素

2、没有索引,没有带索引的方法,也不能使用普通的for遍历

java.util.HashSet集合 implements Set接口

Set接口的一个实现类

HashSet特点:

1、没有重复的元素

2、没有索引,没有带索引的方法,也不能使用普通的for遍历

3、是一个无序的集合,存储和取出的顺序有可能不一致

4、底层是一个哈希表结构(查找快)

public class Demo01Set {
public static void main(String[] args) {
Set<Integer> set = new HashSet<>();
set.add(3);
set.add(3);
set.add(2);
set.add(12);
set.add(22);
set.add(13);// 添加
set.add(222);
System.out.println(set.size());
Iterator<Integer> it = set.iterator();
while(it.hasNext()) {// while迭代器遍历
Integer next = it.next();
System.out.println(next); } for(Integer next: set) {// for each遍历
System.out.println(next);
}
}
}

哈希值

Object类有一个hashCode方法,返回对象的哈希值,一个十进制的值

Student stu = new Student();
int hashcode = stu.hashCode();

Set不允许元素重复的原理

重写了hashCode方法和equals方法,set加入一个对象,首先查看该对象的哈希值,然后看哈希表对应的哈希值是否有对象存储了,如果还没有那么就直接插入哈希表中;如果已经存储着相同哈希值的对象,那么就要使用equals方法比较是不是有相同的对象,如果没有插入。注意哈希表在解决冲突问题的时候采用的是拉链法,在同一个哈希值存储的的元素个数小于8时使用链表,大于等于8就改成了红黑树(红黑树是一棵自平衡的二叉树)

HashSet存储自定义类

没有重写hashCode方法和equals方法之前,两个对象有一样的属性也会被认为是相等的

Person p1 = new Person("zhuobo", 12);
Person p2 = new Person("zhuobo", 12); System.out.println(p1.hashCode());
System.out.println(p2.hashCode()); System.out.println(p1.equals(p2)); // output
//p2p1hashcode: 1282788025
//p2hashcode: 2114694065
//false

重写hashCode方法和equals方法

重写后属性相同就会被认为是相等的,这样在集合中插入对象的时候就不会出现同name同age的对象被插入两次出现重复的现象

@Override
public 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);
} @Override
public int hashCode() {
return Objects.hash(name, age);
} // output now有相同的hashCode
//p1hashcode: -304811560
//p2hashcode: -304811560
//true

最新文章

  1. Linux 环境变量PS1设置
  2. sqlalchemy数据模型
  3. Js获取指定Url参数
  4. Java 程序 ——感想
  5. Python_Day3_基础3
  6. Linux探秘之用户态与内核态
  7. Yii源码阅读笔记(十四)
  8. 正确的理解this 和 super
  9. 使用GitHub建立自己的个人主页
  10. vs2010 更新jQuery智能提示包
  11. 第四节:教你如何快速让浏览器兼容ES6特性
  12. 自己寫的 Loading JS插件
  13. NPOI操作Excel 踩坑记
  14. mac os x 查看网络端口情况
  15. bind与继承 待研究
  16. Python框架学习之Flask中的数据库操作
  17. 比原链Bytom错误码一览
  18. 配置网卡绑卡 --RHEL7
  19. 为什么不要使用&quot;using namespace XXX&quot;
  20. 从FastDFS官网下载我们需要的安装包

热门文章

  1. CS Academy Sliding Product Sum(组合数)
  2. linux中文件的时间戳
  3. emwin 存在多个窗口时,如何获取当前所在窗口
  4. 不能靠眼睛之 KEIL 中失效代码灰暗特性
  5. [WC2018]州区划分(FWT)
  6. 【linux】/dev/null作用和/dev/random
  7. Hyper-V
  8. hdu 2516(Fibonacci博弈博弈)
  9. 借网站日记分析~普及一下Pandas基础
  10. CMakeLists.txt使用