1. 特点:无序、对象不能重复(唯一)
2. 遍历方式(2种)无序:元素添加的顺序于输出的顺序不一致
唯一:不允许添加重复元素Question:元素是被覆盖了?还是过滤了? 答案是:过滤了 。且听细细分解
Setset = new HashSet<>(); set.add(new Student(1,"ax",100f)); set.add(new Student(2,"by",80f)); set.add(new Student(3,"cd",60f)); set.add(new Student(1,"ax",120f)); 1、默认使用equals比较,Object类型是引用类型,默认比较的是内存地址
2、重写hashcode和equals方法,先比较hashcode值是否相同,再比较equals
2.1)hashcode值相同,则比较equals
2.2)hashcode值不相同,则不比较equals由图可知:编号为1的,名字为ax,分数为120f的 被过滤了
创建一个Student类,然后在Demo中调用。
Student.java
package com.zking.collection.entity; import java.io.Serializable; public class Student implements Serializable,Comparable{ private int sid; private String sname; private float score; public Student() { super(); } public Student(int sid, String sname, float score) { super(); this.sid = sid; this.sname = sname; this.score = score; } public int getSid() { return sid; } public void setSid(int 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; } @Override public String toString() { return "Student [sid=" + sid + ", sname=" + sname + ", score=" + score + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; //result = prime * result + Float.floatToIntBits(score); 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; } @Override public int compareTo(Student o) { return this.getSid()-o.getSid();//升序(数字) //return -(this.getSid()-o.getSid());//降序 //return this.getSname().hashCode()-o.getSname().hashCode();//(字符) } }
2.1 foreach
2.2 迭代器
Demo.java
//1、foreach
for (Student student : set) {
System.out.println(student);
}
//iterator(迭代器)
//获取迭代器
Iterator it = set.iterator();
//遍历循环
while(it.hasNext()) {
//移动下标取出元素
System.out.println(it.next());
}
3.常用实现类
HashSet
TreeSet:以某种特定的规则对集合中的元素进行排序(升序和降序)
自然比较接口(默认排序): java.lang.Comparable
比较器: java.util.Comparator
String以AscII码进行比较,返回差值
Setset = new TreeSet<>(new NameComparator()); set.add(new Student(1,"xx",100f)); set.add(new Student(2,"yy",80f)); set.add(new Student(3,"cd",60f)); //输出 set.forEach(System.out::println);
可以自己构建不同比较器,例如名字比较器(字符)、编号比较器(数字)等等
NameComparator 实现Comparator接口
public int compare(Student o1, Student o2) {
return o1.getSname().hashCode()-o2.getSname().hashCode();//(字符)
}
LinkedHashSet:(后期会讲)
1)元素是有顺序的
2)元素是不重复的
3)底层数据结构是按照链表的结构存储的 Linked



