Set集合是属于Collection下的一个分支。
Set集合的特点:无序列,添加进去的顺序和取出来的顺不一样;不重复;无索引。
HashSet:无序,不重复,无索引。
LinkedHashSet:有序,不重复,无索引。
TreeSet:排序,不重复,无索引。
set.of( ):返回一个不可修改的集合,也就是不能再添加、删除元素,如果集合存放的元素是对象,那么对象的属性值可以修改。
Set集合的遍历
因为没有索引,所以不支持普通for循环。
增强for循环:
for (Object obj : set) {
System.out.println(obj);
}
forEach:
set.forEach(obj -> System.out.println(obj));
迭代器
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
HashSet类实现类Set接口,是使用Set集合时最常用的一个实现类。
注意:hashcode就是用对象的某个属性乘一个质数,得到一串数字,用这个数字来表示对象。然后根据hashcode的值确定元素的位置。
public HashSet( ):创建一个空的集合
public HashSet( int capacity ):创建一个初始容量为capacity的集合
public HashSet( int capacity ,float loadFactor):创建一个初始容量为capacity,负载因子为loadFactor的集合。(负载因子就是扩容倍数,capacity默认16,默认是0.75倍扩容)。
TreeSet集合实现了Set接口 ,TreeSet中的元素按照自然排序或者指定的比较器进行排序,并且不允许重复元素。
//比较器排序
public static void main(String[] args) {
Vector vector = new Vector();
vector.add(new Student("张三",23));
vector.add(new Student("孙琦",21));
vector.add(new Student("李四",19));
vector.add(new Student("赵柳",24));
vector.sort(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student s1){
if(o2 instanceof Student s2){
return s1.getAge() - s2.getAge();
}
}
return 0;
}
});
for (Object o : vector) {
System.out.println(o);
}
}
//自然排序要改变类结构
public class Teacher implements Comparable {
private String name;
private int age;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher{name = " + name + ", age = " + age + "}";
}
@Override
public int compareTo(Object o) {
if(o == null){
throw new NullPointerException();
}
if(o instanceof Teacher teacher){
return this.age - teacher.age;
}
throw new ClassCastException();
}
}
public class Student implements Comparable{ // 类声明中实现该接口
// 省略其余代码
@Override
public int compareTo(Object o) { // 重写compareTo方法
if (o == null ) {
throw new NullPointerException();
}
if (this.equals(o)) {
return 0;
}
if (o instanceof Student student) {
return age - student.getAge() > 0 ? 1 : -1;
}
throw new ClassCastException();
}
}
public class TeacherTest {
public static void main(String[] args) {
// ArrayList arrayList = new ArrayList();
// arrayList.add(new Teacher("张三",23));
// arrayList.add(new Teacher("李四",25));
// arrayList.add(new Teacher("王五",19));
// System.out.println(arrayList);
// Teacher teacher = new Teacher();
// teacher.compareTo(arrayList);
TreeSet treeSet = new TreeSet();
treeSet.add(new Teacher("张三",23));
treeSet.add(new Teacher("李四",19));
treeSet.add(new Teacher("王五",28));
System.out.println(treeSet);
}
public TreeSet( )
public TreeSet((Collection c)
public TreeSet(Comparator comparator)
public TreeSet((SortedSet
注意:Treeset集合最大的特点是可以对元素进行排序,但是必须指定元素的排序规则。
E ceiling( E e ):返回此集合中大于等于给定元素的最小元素,如果不存在返回null。
E floor( E e ):返回此集合中小于等于给定元素的最小元素,如果不存在返回null。
Iterator
Iterator
E first( ):返回集合中的第一个元素。
E last( ):返回集合中的最后一个元素。
headSet( E e ):返回小于e的所有元素的集合。
headSet( E e , boolean flag):返回小于等于e的所有元素的集合。
E higher( E e):返回此集合中大于e的所有元素的集合,只是大于,没有等于。
E lower(E e):返回此集合中小于e的所有元素的集合,只是小于,没有等于。
LinkedHashSet继承自HashSet类,同时也实现了Set接口。与HashSet不同的是,HashSet对元素的迭代是顺序是不确定的,而LinkedHashSet的迭代顺序就是按照插入顺序进行的,当需要保留元素的插入顺序时,可以使用LinkedHashSet。