hashset treeset java_Java基础之:Set——HashSet & TreeSet

Java基础之:Set——HashSet & TreeSet

5aa7f0d608be5bbd6fbda1c709322c62.png

HashSet

HashSet实现了Set接口(不可以重复元素),HashSet实际上底层是HashMap(看后面源码以及HashMap)。

HashSet不保证元素是有序的,顺序取决于hash之后,再进行去索引的结果。

HashSet底层机制(hashCode + equals)

HashSet底层是HashMap

添加一个元素时,先得到此元素的hashCode值,对HashCode值进行计算得到索引值。

找到存储数据表table,查看此索引值位置上是否已经存放有元素。

若没有则直接加入,若有则需要调用equals方法进行比较,如果相同则放弃添加(Set接口不允许重复就是这样判断的)。

若在同一个索引位上有多个元素,它们是以链表的形式存放的,当达到一定数量时,链表会自动树化,变为红黑树。

7a69e3d422a52bdfcfc00ad1d80db597.png

简单案例

package class_HashSet;import java.util.HashSet;​public class ClassTest01{​ @SuppressWarnings({ "unchecked", "rawtypes" }) public static void main(String[] args) { HashSet hashSet = new HashSet(); hashSet.add("Hello01"); hashSet.add("Hello02"); hashSet.add("Hello03"); hashSet.add("Hello04"); for(int i = 0;i<8;i++) { //将会有8个Dog对象,放在同一个索引处,形成链表 hashSet.add(new Dog()); } System.out.println(hashSet); }​}class Dog{ @Override public int hashCode() { //让Dog的所有实例对象的hashCode都为1 return 1; } @Override public boolean equals(Object obj) { //让Dog的所有实例对象在比较时都返回false,即都不相同。 return false; }​ //当hashCode固定为1,equals为false时,会一直加入到HashSet数据表中的一个索引位上}

实际应用案例

定义一个Employee类,该类包含:private成员属性name(String),age(int),birthday(MyDate),

其中 birthday 为 MyDate类(属性包括:year(int), month(int),day(int))的对象, 要求:

创建3个Employee 放入 HashSet中,当 name和birthday一样时,认为是同一个员工, 就不能添加到HashSet集合中

提示: 根据前面HashSet 的添加机制,想办法 重写 Employe和MyDate的hashCode 和 equals方法

比如 “张三”, 2000-11-11

package class_HashSet;import java.util.HashSet;import java.util.Set;public class ClassWork01 {@SuppressWarnings({ "unchecked", "rawtypes" })public static void main(String[] args) {Employee employee = new Employee("小范", 20, new MyDate(2000, 3, 26));Employee employee2 = new Employee("小黄", 18, new MyDate(1999, 11, 25));Employee employee3 = new Employee("小范", 20, new MyDate(2000, 3, 26));Set set = new HashSet();set.add(employee);set.add(employee2);set.add(employee3);for(Object obj : set) {System.out.println(obj);} }}class Employee{private String name;private int age;private MyDate birthday;public Employee(String name, int age, MyDate birthday) {super();this.name = name;this.age = age;this.birthday = birthday;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * r.........

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值