Day 17 set 集合

1,hashSet

Set 接口  无序 不可重复

  特有方法:

 

Set set = new HashSet();

---| Set 接口   无序  不可重复
 ------| HashSet  底层维护是一个【哈希表】,存储效率很高!!!
 ------| TreeSet 
 
 发现:
  1. 添加元素的时候,每一次都会调用hashCode方法
  2. 重写equals方法和HashCode方法,也是首先调用hashCode方法,再来调用equals方法
 
 HashSet存储原理:【背下来!!!】
  向HashSet集合中添加元素,HashSet首先会调用该元素hashCode方法,获取该对象的Hash值
  通过【移位】运算,计算出,该元素应该保存在【哈希表】中哪一个位置
 
  情况1:
  该位置没有任何元素,直接放入
 
  情况2:
该位置存在其他元素,哈希表就会调用该元素的equals方法,和已经保存在哈希表里面的元素进行
比较
如果比较结果为true 表示相同元素,无法添加
如果比较结果为false,表示为不同元素,可以添加
哈希表的每一个单元格都是一个桶式结构,可以保存多个元素,允许元素共存!!!

set.add(new Student(3, "翘臀"));

@Override
public boolean equals(Object obj) {
System.out.println("======equals======");

Student stu = (Student) obj;
System.out.println(this.name + "和" + stu.name + "比较!!!");
return this.name.equals(stu.name);
}

@Override
public int hashCode() {
System.out.println("====HashCode======");
return this.id;
}

@Override
public String toString() {
return "[ID : " + id + " Name : " + name + "]";
}

2,treeSet

/*
 TreeSet是一个树形结构的Set结构 
  发现:
  TreeSet中添加元素原本是字符串类型,当添加自定义对象,或者数字的时候,报异常!!!
  ClassCastException
 
  原因:
  因为TreeSet是一个树形结构,所有的元素都需要进行比较之后才可以放入到Set集合中,而
  字符串和自定义类对象是没有比较的方式和方法的
 
  【要求】在TreeSet里面的所有的元素都要有【比较的方式】或者有【自然顺序】
 
  TreeSet添加自定义元素的方式:
  方式1:
  让这个自定义类【遵从】Comparable接口,实现compareTo方法
 
  方式2:
  自定义比较器,这个比较器是【遵从】Comparator接口,实现
  int compare(Object o1, Object o2)
 
  可以在创建TreeSet对象的时候,传入比较器对象作为比较方式
 */


class Person implements Comparable{
int id;
String name;
int salary;

public Person() {}

public Person(int id, String name, int salary) {
this.id = id;
this.name = name;
this.salary = salary;
}


@Override
public int compareTo(Object o) {
/*
返回值有三种: 0  正整数  负整数
0 表示相同
正整数表示【调用这个方法的对象】大于传值的对象 
负整数表示【调用这个方法的对象】小于传值的对象 
*/


//以工资为标准进行判断
System.out.println("这里是类内的比较方式");
Person p = (Person) o;
return this.salary - p.salary;
}

@Override
public String toString() {
return "[ID : " + id + " Name : "  + name + " Salary : " + salary + "]";
}
}


class MyCompare implements Comparator {


@Override
public int compare(Object o1, Object o2) {
System.out.println("自定义比较器");
Person p1 = (Person) o1;
Person p2 = (Person) o2;
return p1.salary - p2.salary;
}

}


public class Demo1 {
public static void main(String[] args) {

//TreeSet set = new TreeSet();
//创建TreeSet 的时候,传入自定义比较器对象
TreeSet set = new TreeSet(new MyCompare());
//set.add(1);
set.add(new Person(1, "大熊", 20));
set.add(new Person(2, "骚磊", 21));
set.add(new Person(3, "骚杰", 18));
set.add(new Person(4, "林妹妹", 15));
set.add(new Person(5, "康爷", 2));
System.out.println(set);
}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值