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);
		}
	}
}