1. Set目录
1.1 特点:无序、对象不能重复
/**
* set
* 1.特点:无序 ,唯一
* 1)无序:无序添加的顺序与输出的顺序不一致
* 唯一: 不允许添加重复的元素
*问题:
*元素是被覆盖了?还是过滤了?
*/
/*Set<String> set =new HashSet<>();
set.add("zs");
set.add("ls");
set.add("ww");
set.forEach(System.out::println);*/
1.2 遍历
1.2.1 foreach
1.2.2 迭代器
Set<Student> set =new HashSet<>();
set.add(new Student(1,"zs",100f));
set.add(new Student(2,"ls",20f));
set.add(new Student(3,"ww",30f));
set.add(new Student(4,"zs",100f));
//1)默認 使用equals比較,objcet类型是引用类型,默认比较的是内存地址
//2)重寫hashCode和equals類型是引用類型,先比較hashCode的值是否相同,在比較equels
//hascode值相同,则比较equals
//hascode值不相同,则不比较equals
// Student stu=new Student();
// stu.equals(null);
//set.forEach(System.out::println);
//遍历方式(2种)
//1)foreach
for (Student student : set) {
System.out.println(student);
}
System.out.println("----------------");
//2)iterator迭代器
//获取遍历
Iterator<Student> it=set.iterator();
//遍历循环
while(it.hasNext()) {
System.out.println(it.next());
}
1.3 常用实现类
HashSet
TreeSet:根据某种(规则)对里面的元素进行排序
自然比较接口: java.lang.Comparable
比较器: java.util.Comparator
String以AscII码进行比较,返回差值
Student实体类
public class Student implements Serializable, Comparable<Student> {
private int sid;
private String sname;
private Float score;
public Student(int sid, String sname, Float score) {
super();
this.sid = sid;
this.sname = sname;
this.score = score;
}
public Student() {
super();
}
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((score == null) ? 0 : score.hashCode());
result = prime * result + sid;
result = prime * result + ((sname == null) ? 0 : sname.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
/**
* true?存在 false?(不存在) 当期那对象是否与obj对象相同
*
*/
if (this == obj)
return true;
// obj是否为空
if (obj == null)
return false;
// 当前对象类型与obj类型不相同
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (this.getSid() == other.getSid())
return false;
return true;
}
public void setSname(String sname) {
this.sname = sname;
}
public Float getScore() {
return score;
}
public void setScore(Float score) {
this.score = score;
}
@Override
public String toString() {
return "Student [sid=" + sid + ", sname=" + sname + ", score=" + score + "]";
}
@Override
public int compareTo(Student o) {
// 比较者大于被比较者 返回1
// 比较者等于被比较者 返回0
// 比较者小于被比较者 返回-1
/*if (this.getSid() > o.getSid())
return 1;
else {
if (this.getSid() == o.getSid()) {
return 0;
} else {
return -1;
}
}*/
//降序)
// return -(this.getSid()-o.getSid());
//(升序和
//return this.getSid()-o.getSid();
return this.getSname().hashCode()-o.getSname().hashCode();
}
Demo1
public static void main(String[] args) {
//TreeSet:以某种特定的的规则对集合中的元素进行排序(升序和降序)
//java.lang.Comparable:自然比较接口必须在类里面实现接口 然后重新方法
java.util.Comparable:比较器(推荐)
//字母进行了排序(升序)
Set<String> set1 =new TreeSet<>();
set1.add("zs");
set1.add("ls");
set1.add("ww");
//类错误
Set<Student> set =new TreeSet<>(new NameComparator());
set.add(new Student(1,"zs",100f));
set.add(new Student(2,"ls",20f));
set.add(new Student(3,"ww",30f));
set.forEach(System.out::println);
}
NameComparator类
public class NameComparator implements Comparator<Student>{
//比较器: java.util.Comparator
//Student o1与 Student o2作比较
public int compare(Student o1, Student o2) {
return o1.getSid()-o2.getSid();
}
// String以AscII码进行比较,返回差值