Collection
1–List
有序(存储顺序和取出顺序一致),可重复
2–Set
无序(存储顺序和取出顺序不一致),唯一
虽然Set集合无需,但是,作为集合来说,他肯定有它自己的存储顺序,而你的顺序和它的存储顺序一致,这代表不了有序;
你可以多存储一些数据,就可以看到效果;
HashSet:它不可保证set的迭代顺序,特别是它不保证该顺序恒久不变,
public class Student {
public String name;
public int age;
public Student(String name,int age) {
this.name = name;
this.age=age;
}
//重写
@Override
public int hashCode() {
/*
return 0;如果有10000个元素要比,会使后面相比的效率太低,所以我们尽可能让他们的哈希值不同
因为成员变量值,影响了哈希值,所以我们把成员变量值相加即可
return this.name.hashCode()+this.age;
但这样也不够好,如:
s1:name.hashCode()=40;this.age=30;
s2:name.hashCode()=20;this.age=50;
为尽可能的区分,我们把他们乘一些整数
*/
return this.name.hashCode()+this.age*13;
}
//不管哪个对象调用这个方法,返回值都是0,那么他们的哈希值就会是一样的,就可以执行接下来的equals()方法了;
/*
这个方法发重写分3步
1:提高效率的
2:如果你不是学生的对象,那就没用必要比较了,没用可比性
3:把你转成学生
*/
@Override
public boolean equals(Object obj) {
if(this==obj){
return true;
}
if(!(obj instanceof Student)){
return false;
}
Student s=(Student)obj;
return this.name.equals(s.name) && this.age==s.age;
//比较自己想比较的属性值是否相等,如果相等,就返回true;
}
/*
学完了,结果发现这2个重写不用自己写,你只要导入就可以了,eclipse和idea都有快捷键。。。。
右键Generate 选择equals() and hashCode()就可以了
下面是它为我们导入的
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student student = (Student) o;
return age == student.age &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
*/
}
import java.util.HashSet;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
//创建集合对象
Set<String> set=new HashSet<String>();
//创建并添加元素
set.add("hello");
set.add("world");
set.add("java");
//增强for
for(String s:set){
System.out.println(s);
}
/*
需求:存储自定义对象,并保证元素我唯一性;
要求:如果两个元素的成员变量值都相等,则为同一个元素
目前是不符合需求的,因为我们知道HashSet底层是依赖hashCode()和equals()方法;
而这2个方法我们在学生类中没用重写,所有默认是Object类;
而这个时候,他们的哈希值是不会一样的,根本就不会继续判断,执行了添加操作
具体可以看看源码;17.13附近那几p说了,要是忘了回去看看;
只有哈希值相同,才能执行equals()方法;
解决:方法重写
*/
//创建集合对象
HashSet<Student> hs=new HashSet<Student>();
//创建学生对象
Student s1=new Student("林青霞",27);
Student s2=new Student("柳岩",22);
Student s3=new Student("王祖贤",30);
Student s4=new Student("林青霞",27);
Student s5=new Student("林青霞",20);
Student s6=new Student("范冰冰",22);
//添加元素
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
hs.add(s6);
//遍历集合
for(Student s:hs){
System.out.println(s.name+"----"+s.age);
}
}
}
程序运行结果为:
world
java
hello
林青霞----20
林青霞----27
范冰冰----22
柳岩----22
王祖贤----30
来源:CSDN
作者:绝代风华.
链接:https://blog.csdn.net/qq_44818449/article/details/103236231