Set也是Collection 的一个子类,
Set的功能和Collection的一样,但Set 与 List 不同,Set不允许有重复的元素,存储顺序和去除顺序不一致。
Set 接口的常用子类有 HashSet 和TreeSet
1、HashSet:
不保证Set的迭代顺序,特别是他不保证改成顺序恒久不变
HashSet遍历:
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("hello");
set.add("world");
set.add("java");
set.add("world");
for(String x: set) {
System.out.println(x);
}
}
}
2、TreeSet:
能够对元素按照某种规则进行排序
底层是二叉树结构
特点:排序,唯一
(1)自然排序:让元素所属的类实现Comparable接口
import java.util.TreeSet;
public class TreeSetDemo1 {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>();
ts.add(19);
ts.add(16);
ts.add(21);
ts.add(22);
ts.add(18);
for(Integer i: ts) {
System.out.println(i);
}
}
}
存储自定义对象并遍历(先按照年龄排序):
import java.util.TreeSet;
class Student3 implements Comparable<Student3>{
String name;
int age;
public Student3(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public int compareTo(Student3 s) {
int c = this.age - s.age;
int num = c == 0 ?this.name.compareTo(s.name) : c;
return num;
}
}
public class TreeSetDemo1 {
public static void main(String[] args) {
TreeSet<Student3> ts = new TreeSet<Student3>();
Student3 s = new Student3("chenxuedong",29);
Student3 s1 = new Student3("kezhendong",27);
Student3 s2 = new Student3("nanzhuhe",29);
Student3 s3 = new Student3("zhangyixing",28);
Student3 s4 = new Student3("wuyifan",30);
Student3 s5 = new Student3("chenxuedong",29);
ts.add(s);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(Student3 stu : ts) {
System.out.println(stu.name + "----" + stu.age);
}
}
}
(2)比较器排序:让集合的构造方法接受一个比较器接口的子类对象
存储自定义对象并遍历(先按照姓名排序):
import java.util.Comparator;
import java.util.TreeSet;
//优先按照姓名排序
class Student3{
String name;
int age;
public Student3(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
}
class MyComparator implements Comparator<Student3>{
@Override
public int compare(Student3 s1, Student3 s2) {
//比较姓名长度
int num1 = s1.name.length() - s2.name.length();
//比较姓名的内容
int num2 = num1 == 0 ? s1.name.compareTo(s2.name) : num1;
//比较年龄
int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
return num2;
}
}
public class TreeSetDemo1 {
public static void main(String[] args) {
TreeSet<Student3> ts = new TreeSet<Student3>(new MyComparator());
Student3 s = new Student3("chenxuedong",29);
Student3 s1 = new Student3("kezhendong",27);
Student3 s2 = new Student3("nanzhuhe",29);
Student3 s3 = new Student3("zhangyixing",28);
Student3 s4 = new Student3("wuyifan",30);
Student3 s5 = new Student3("chenxuedong",29);
ts.add(s);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(Student3 stu : ts) {
System.out.println(stu.name + "----" + stu.age);
}
}
}