目录
思维导图:
一、set集合的特点
1、不可重复:基本数据类型&String
2、无序
二、set集合的遍历方式
1、foreach遍历
2、迭代器遍历
代码如下:
package com.liaoxin.set;
import java.util.HashSet;
import java.util.Iterator;
/**
* set集合的特点
* 不重复:基本数据类型&String
* @author 廖鑫
*
* 2022年6月8日下午4:45:37
*/
public class Demo1 {
public static void main(String[] args) {
HashSet<Object> set = new HashSet<>();
set.add("zs");
set.add("ls");
set.add("ww");
set.add("老六");
set.add("ls");
System.out.println(set.size());
System.out.println("===========增强for==========");
for (Object obj : set) {
System.out.println(obj);
}
System.out.println("==========迭代器==========");
Iterator<Object> it=set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
运行效果如下:
三、set底层去重原理
代码展示:
package com.liaoxin.set;
import java.util.HashSet;
/**
* set集合底层去重原理
* 1.set集合去重底层原理是与对象的hashcode以及equals方法相关
* 2.在判断重复元素的时候,是先比较hashcode值,再调用equals比较内容
* @author 廖鑫
*
* 2022年6月8日下午5:08:08
*/
public class Demo2 {
public static void main(String[] args) {
HashSet<Object> set = new HashSet<>();
set.add(new person("zs", 18));
set.add(new person("ls", 14));//distrinct:去重
set.add(new person("ww", 24));
set.add(new person("老六", 22));
set.add(new person("zs", 18));
System.out.println(set.size());
}
}
class person /*implements Comparable<person>*/{
private String name;
private int age;
private int level;
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public person() {
// TODO Auto-generated constructor stub
}
public person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public person(String name, int age, int level) {
super();
this.name = name;
this.age = age;
this.level = level;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + ", level=" + level + "]";
}
@Override
public int hashCode() {
System.out.println("===========hashCode===========");
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return 1;
}
@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;
person other = (person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
// @Override
// public int compareTo(person o) {
// int levelRes = this.level - o.level;
// return levelRes ==0 ? this.age - o.age : levelRes;
// }
}
运行效果如下:
结论:1、set去重底层原理是与对象的hashcode以及equals方法相关
2、判断重复元素的时候,是比较hashcode值,在调用equals比较内容
四、treeSet(自然排序比较器排序)
1、java.lang.Comparable:自然排序 排序的规则是单一的,不能够应对复杂的变化的需求
2、java.util.comparator:比较器排序
代码展示:
package com.liaoxin.set;
import java.util.Comparator;
import java.util.TreeSet;
/**
* set集合排序
* java.lang.Comparable:自然排序 排序的规则是单一的,不能够应对复杂的变化的需求
* java.util.comparator:比较器排序
* @author 廖鑫
*
* 2022年6月8日下午6:29:21
*/
public class Demo3 {
public static void main(String[] args) {
/**
* 需求1:从xxx公司拿到用户数据,需要根据用户的级别,进行会议作业的排序
* 需求2:按照年龄进行升序,打印出人员信息
* 需求3:按照用户的首字母排序
*/
// Exception in thread "main" java.lang.ClassCastException:
// com.liaoxin.set.person cannot be cast to java.lang.Comparable
// TreeSet set=new TreeSet<>(new levelCompartor());
// TreeSet<person> set=new TreeSet<>((x,y)-> x.getName().compareTo(y.getName()));
TreeSet<person> set=new TreeSet<>((x,y)-> {
int ageRes = x.getAge() - y.getAge();
int levelRes = 0;
if(ageRes == 0) {
levelRes=x.getLevel() - y.getLevel();
}
else {
return ageRes;
}
return levelRes;
});
set.add(new person("zs", 18, 1));
set.add(new person("ls", 24, 4));
set.add(new person("ww", 26, 2));
set.add(new person("laoliu", 20, 3));
set.add(new person("bajie", 18, 3));
for (Object object : set) {
System.out.println(object);
}
}
public static void main2(String[] args) {
/**
* 需求:从xxx公司拿到用户数据,需要根据用户的级别,进行会议作业的排序
* 张三 部门总监 1
* 李四 普通员工 3
* 王五 部门经理 2
*
* xxxService.list(1);
*
* 现象:
* 1.String默认是能够排序的
* 2.自定义的对象无法排序,报类型转换异常
*
* 需求2:
* 按照年龄进行升序,打印出人员信息
*
* 需求3:
* 按照用户的首字母排序
*/
// Exception in thread "main" java.lang.ClassCastException:
// com.liaoxin.set.person cannot be cast to java.lang.Comparable
TreeSet set=new TreeSet<>();
set.add(new person("zs", 18, 1));
set.add(new person("ls", 24, 4));
set.add(new person("ww", 26, 2));
set.add(new person("laoliu", 20, 3));
set.add(new person("bajie", 18, 3));
for (Object object : set) {
System.out.println(object);
}
}
}
class levelCompartor implements Comparator<person>{
@Override
public int compare(person o1, person o2) {
int levelRes=o1.getLevel() - o2.getLevel();
return levelRes == 0 ? o1.getAge() - o2.getAge() : levelRes;
}
}
运行效果如下: