文章目录
一. 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;
}
}