Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素,而且Set接口中元素无序。
package MONA.demo04_set;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Demo01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println("list = " + list);
//排序无序
//不能存储重复元素
Set set = new HashSet();
set.add("bbb");
set.add("aaa");
set.add("ccc");
System.out.println("set = " + set);
}
}
HashSet存储自定义对象
package MONA.demo04_set;
import java.util.HashSet;
public class Demo02 {
public static void main(String[] args) {
// HashSet hashSet = new HashSet();
// //String
// hashSet.add("aaa");
// hashSet.add("bbb");
// hashSet.add("ccc");
// hashSet.add("ccc");
//Set集合不存储重复元素
HashSet<Student> hashSet = new HashSet<>();
hashSet.add(new Student("李四",19));
hashSet.add(new Student("王五",20));
hashSet.add(new Student("赵六",21));
hashSet.add(new Student("赵六",21));
System.out.println(hashSet);
//HashSet集合在存储元素时,会调用hashCode和equals方法
//只有hashCode返回相同时,我们才会调用equals
//为什么调用方法?
//Student是我们自己定义的类型(对象),匹配相等的规则是由我们来编写的
// String name1 = "李四";
// String name2 = "李四";
// System.out.println(name1.hashCode());
// System.out.println(name2.hashCode());
}
}
class Student{
String name;
int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//计算内存的值
//返回该对象内存地址的值
@Override
public int hashCode() {
System.out.println("hashCode 被调用了");
//姓名地址的值加上年龄
return this.name.hashCode() + age;
}
@Override
public boolean equals(Object obj) {
System.out.println("equals 被调用了");
Student s = (Student) obj;
if(this.name.equals(s.name) && this.age == age){
return true;
}
return true;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
HashCode 的使用
package MONA.demo04_set;
import java.util.HashSet;
import java.util.Objects;
/**
* HashSet 不存储重复元素
* 依靠
* hashCode equals来判断元素是否重复
*/
public class Demo03 {
public static void main(String[] args) {
HashSet<Teacher> hashSet = new HashSet<>();
hashSet.add(new Teacher("老王",29));
hashSet.add(new Teacher("老李",35));
hashSet.add(new Teacher("老李1",35));
hashSet.add(new Teacher("老李1",36));
System.out.println(hashSet);
}
}
class Teacher{
String name;
int age;
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写HasCode 和 equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Teacher teacher = (Teacher) o;
return age == teacher.age &&
Objects.equals(name, teacher.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
为什么java提供的类不需要重写hashcode和equals方法
因为所有的包装类都重写了hashCode 和 equals方法
package MONA.demo04_set;
import java.util.HashSet;
public class Demo04 {
public static void main(String[] args) {
HashSet hashSet = new HashSet();
//String
// hashSet.add("aaa");
// hashSet.add("bbb");
// hashSet.add("aaa");
//为什么我们没有重写String的hashCode和equals方法
//HashSet就可以自动判断重复?
//String 因为Java在写String类时,已经帮我们重写了两个方法
//int--->Integer
hashSet.add(111);
hashSet.add(222);
hashSet.add(333);
hashSet.add(111);
//所有的包装类都重写了hashCode 和 equals方法
System.out.println(hashSet);
}
}
LinkedHashSet集合使用
package MONA.demo05_linkedhashset;
import java.util.LinkedHashSet;
public class Demo01 {
public static void main(String[] args) {
//存取顺序有序
LinkedHashSet linkedHashSet = new LinkedHashSet();
linkedHashSet.add("ddd");
linkedHashSet.add("bbb");
linkedHashSet.add("aaa");
linkedHashSet.add("ccc");
System.out.println(linkedHashSet);
}
}