一. set集合的特点
1.1 无序性
即元素添加顺序与输出顺序不一致。
1.2 无下标
集合本身是一个容器,具备增删改查的功能,因为没有下标,则没有修改的方法。
1.3 不可重复
运行后的结果:
二. set集合的遍历方式
2.1 foreach遍历
2.2 迭代器遍历
因为set无下标,所以与list相比,遍历方式只有两种,foreach与iterator。
三. set集合去重原理
3.1底层调用hashcode方法和equals方法。
先调用hashcode方法进行筛选,若hashcode值相同,再调用equals方法进行对比,若equals值也相同,则判定为同一个对象,则不能添加成功。
package com.xissl.set; import java.util.HashSet; /** * set集合底层去重原理 * @author xissl * */ public class Demo03 { public static void main(String[] args) { HashSet hs = new HashSet<>(); //将对象添加到集合中 hs.add(new Student(1, "zs")); hs.add(new Student(2, "ls")); hs.add(new Student(3, "ww")); hs.add(new Student(3, "ww")); for (Object object : hs) { System.out.println(object); } } } //定义一个学生类 class Student{ private int id; private String name; public Student() { // TODO Auto-generated constructor stub } public Student(int id, String name) { super(); this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + "]"; } @Override public int hashCode() { System.out.println("hashCode方法被调用"); final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { System.out.println("equals方法被调用"); if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (id != other.id) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } }
运行结果为:
四. set集合排序
4.1 自然排序
实现Comparable接口,重写compareTo方法
4.2 比较器排序
实现Comparator接口
package com.xissl.set; import java.util.Comparator; import java.util.HashSet; import java.util.TreeSet; /** * set集合排序 * 1.自然排序 * 2.比较器排序 * @author xissl * */ public class Demo04 { public static <T> void main(String[] args) { HashSet set = new HashSet<>(); set.add(new Person(1, "zs", 22, 10000)); set.add(new Person(2, "ls", 28, 17000)); set.add(new Person(3, "ww", 32, 20000)); set.add(new Person(4, "zl", 26, 17000)); //默认排序 for (Object object : set) { System.out.println("集合默认排序为:"+object); } TreeSet ts = new TreeSet<>(); //调用set接口拿到数据再进行排序,自然排序 for (Object object : set) { ts.add(object); } //根据id排序 for (Object object : ts) { System.out.println("根据id自然排序结果为:"+object); } //使用比较器排序 TreeSet tsPlus = new TreeSet<>(new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { //先根据金额排序,再根据年龄降序。 int num = p1.getMoney()-p2.getMoney(); if(num==0) { return p2.getSge()-p1.getSge(); } return num; } }); for (Object object : ts) { tsPlus.add(object); } for (Object object : tsPlus) { System.out.println("使用比较器排序结果为:"+object); } } } class Person implements Comparable<Person>{ private int id; private String name; private int sge; private int money; public Person() { // TODO Auto-generated constructor stub } public Person(int id, String name, int sge, int money) { super(); this.id = id; this.name = name; this.sge = sge; this.money = money; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSge() { return sge; } public void setSge(int sge) { this.sge = sge; } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } @Override public String toString() { return "Person [id=" + id + ", name=" + name + ", sge=" + sge + ", money=" + money + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; result = prime * result + money; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + sge; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Person other = (Person) obj; if (id != other.id) return false; if (money != other.money) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; if (sge != other.sge) return false; return true; } @Override public int compareTo(Person p) { //返回根据id升序排序 return this.id-p.id; } }