1.1 特点:无序、对象不能重复
1.2 遍历
1.2.1 foreach
1.2.2 迭代器
1.3 常用实现类
HashSet
TreeSet:根据某种(规则)对里面的元素进行排序
自然比较接口: java.lang.Comparable
比较器: java.util.Comparator
String以AscII码进行比较,返回差值
我们在这里提到一个概念对象不能重复,那到底是过滤还是覆盖呢,来,跟着我一步一步推,如果我们直接给两个一样的值,是看不出来覆盖还是过滤如图:
Set<String> set=new HashSet<>();
set.add("苏");
set.add("华");
set.add("少");
set.add("99");
set.add("99");
set.forEach(System.out::println);

所以我们就必须要用到实体类,这里我使用student类为例:
private Integer sid;
private String sname;
private float score;
public Student() {
super();
}
public Student(Integer sid, String sname, float score) {
super();
this.sid = sid;
this.sname = sname;
this.score = score;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public float getScore() {
return score;
}
public void setScore(float score) {
this.score = score;
}
通过代码我们可以很容易发现我们这里使用了学号,姓名,以及成绩三个字段,在到我们的测试类
创建学生对象
Set<Student> set=new HashSet<>();
set.add(new Student(1,"苏柱华",100f));
set.add(new Student(2,"山西",100f));
set.add(new Student(1,"华",20f));
Student stu=new Student();
stu.equals(null);
set.forEach(System.out::println);
Iterator<Student> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
在这里重写equals方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
//result = prime * result + Float.floatToIntBits(score);
result = prime * result + ((sid == null) ? 0 : sid.hashCode());
//result = prime * result + ((sname == null) ? 0 : sname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if(this.getSid()==other.getSid())
return true;
return true;
}
大功告成

根据成绩100,我们可以看出是我们第一次加进去的值,所以第三次的值是被过滤了。


被折叠的 条评论
为什么被折叠?



