1.Set集合
Set集合也是用来存储数据的
Set也是一个接口
父接口是Collection
存储数据的特征: 无序的 不可重复的
Set接口有两个实现类:
HashSet:
依靠hash值进行存储的,如果两个元素hash值一样的话,就不再存储了
TreeSet:
底层是二叉树,对存储数据进行自然排序
1.1hashSet类
HashSet这个类的方法和Collection接口和Set接口下面一样的
也有自己独有的方法,和ArrayList特别象
package com.qfedu.b_hashSet; import java.util.HashSet; import java.util.Set; public class Demo1 { public static void main(String[] args) { Set<String> set = new HashSet<>(); //set集合存储的无序的 不可重复的 set.add("b"); set.add("a"); set.add("d"); set.add("c"); set.add("a"); set.add("ad"); System.out.println(set); Set<Integer> set1 = new HashSet<>(); set1.add(78); set1.add(23); set1.add(100); set1.add(56); System.out.println(set1); set1.remove(23); //循环 for (Integer integer : set1) { System.out.println(integer); } } }
1.2HashSet集合存对象
package com.qfedu.b_hashSet;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
class Person {
int id;
String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return id == person.id && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public class Demo2 {
public static void main(String[] args) {
Person person1 = new Person(1, "zhangsan");
Person person2 = new Person(1, "李四");
Person person3 = new Person(1, "李四");
Person person4 = new Person(1, "李四");
Set<Person> set = new HashSet<>();
//在调用add方法的时候 底层在调用hashCode方法和equals
set.add(person1);
set.add(person2);
set.add(person3);
set.add(person4);
System.out.println(set);
//感觉不太合适,发现存的两个对象的内容是一样。真实开发的时候
//只关注内容的,如果内容一样,我也让你存不进去。!!!
//咋办
//总结:以后set集合中如果想存对象的时候,要求对象的内容如果一样的
//话,不能存到set集合中,咋办?重写equals方法和hahsCode方法
//hash值不一样,对象一定不一样。
//对象一样的话,hash只能一定一样
}
}
1.3TreeSet集合
也是实现了Set集合,可以保证数据 唯一性,存储也是无序的
package com.qfedu.c_treeSet;
import java.util.Set;
import java.util.TreeSet;
public class Demo1 {
public static void main(String[] args) {
//TreeSet在存储的数据的时候 会排序
Set<Integer> set = new TreeSet<>();
set.add(89);
set.add(79);
set.add(69);
set.add(109);
set.add(39);
System.out.println(set);
Set<String> set1 = new TreeSet<>();
set1.add("d");
set1.add("w");
set1.add("a");
set1.add("c");
System.out.println(set1);
}
}
1.4TreeSet集合中存的是对象
如果想要在TreeSet集合中添加对象的话
要去实现Comparable这个接口
抽象方法:
int
compareTo(T o)
将此对象与指定的对象进行比较以进行排序。
将此对象与指定的对象进行比较以进行排序。 返回一个负整数,零或正整数,因为该对象小于,等于或大于指定对象。
stu1.comparetTo(stu2)
得有一个int类数据
好好思考一个问题:你得给我返回一个int类型的数据
stu1有age变量 stu1的年龄 减去 stu2的年领
如果年龄返回值是一个负数的话: stu1的年领小与 stu 2
如果年龄返回值是一个0的话,stu1的年龄和stu2年龄相等
如果年龄返回值是一个正整数的话: stu1的年领大于 stu 2
stu1 45
stu2 35
stu3 25
compareTo
set.add(stu1); 第一次调用compareTo
stu1和stu1在比较 45-45 =0 只保留 stu1
set.add(stu2)的时候
又调用compareTo() 第二次调用compareTo
o:stu1
this: stu2 35 - 45 = -10 负数 stu2 比stu1小 咋排 [stu2, stu1]
set.add(stu3)的时候 第三次调用compareTo
this: stu3
o: stu1
[stu3, stu1]
第四次调用compareTo
this:stu3
o:stu2 [stu3 stu2]
[stu3 stu2 stu1]
package com.qfedu.c_treeSet;
import java.util.Set;
import java.util.TreeSet;
class Student implements Comparable<Student>{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
System.out.println("123");
int num = this.age - o.age;
return num;
}
}
public class Demo2 {
public static void main(String[] args) {
Student stu1 = new Student("老邢", 45);
Student stu2 = new Student("老邢", 35);
Student stu3 = new Student("saolei", 25);
Student stu4 = new Student("老万", 87);
//按照年龄进行排序 存到TreeSet集合中
Set<Student> set = new TreeSet<>();
set.add(stu1);
set.add(stu2);
set.add(stu3);
set.add(stu4);
System.out.println(set);
// Exception in thread "main" java.lang.ClassCastException:
// com.qfedu.c_treeSet.Student cannot be cast to java.lang.Comparable
// at java.util.TreeMap.compare(TreeMap.java:1294)
//类转换异常的错误,Student转换不了Comparable
//y因为底层在进行排序的时候,实现了Comparable这个接口
//为啥泛型String没有报错 Integer也没有报错
}
}
总结:
1.Object类 都有快捷键 2.HashSet存对象的时候,一定在类中重写equals和hashCode方法 3.TreeSet存对象的时候,一定要实现一个接口Comparable,重写compareTo方法 比较两个对象某个属性的int类型差值
数据结构简单的介绍