Set相关常见知识

Comparable 和 Comparator 的区别

Java 中用于排序的接口

现在有个 ArrayList 数组:[-7, -9, 4, 7, -5, 3, 3, -1],进行 Comparator 定制排序操作:

// void sort(List list),按自然排序的升序排序
Collections.sort(arrayList);
System.out.println("Collections.sort(arrayList):");
System.out.println(arrayList);

// 定制排序的用法
Collections.sort(arrayList, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
    }
});
System.out.println("定制排序后:");
System.out.println(arrayList);

输出:

Collections.sort(arrayList):
[-9, -7, -5, -1, 3, 3, 4, 7]
定制排序后:
[7, 4, 3, 3, -1, -5, -7, -9]

重写 compareTo 方法实现按年龄来排序

// person对象没有实现Comparable接口,所以必须实现,这样才不会出错,才可以使treemap中的数据按顺序排列
// 前面一个例子的String类已经默认实现了Comparable接口,详细可以查看String类的API文档,另外其他
// 像Integer类等都已经实现了Comparable接口,所以不需要另外实现了
public  class Person implements Comparable<Person> {
    private String name;
    private int age;
	//...
    /**
     * T重写compareTo方法实现按年龄来排序
     */
    @Override
    public int compareTo(Person o) {
        if (this.age > o.getAge()) {
            return 1;
        }
        if (this.age < o.getAge()) {
            return -1;
        }
        return 0;
    }
}
public static void main(String[] args) {
	TreeMap<Person, String> pdata = new TreeMap<Person, String>();
	pdata.put(new Person("张三", 30), "zhangsan");
	pdata.put(new Person("李四", 20), "lisi");
	pdata.put(new Person("王五", 10), "wangwu");
	pdata.put(new Person("小红", 5), "xiaohong");
	// 得到key的值的同时得到key所对应的值
	Set<Person> keys = pdata.keySet();
	for (Person key : keys) {
		System.out.println(key.getAge() + "-" + key.getName());
	}
}

输出:

5-小红
10-王五
20-李四
30-张三

无序性和不可重复性的含义是什么

比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同