package com.collection.set;
import java.util.TreeSet;
import org.junit.Test;
/*
集合的体系:
----| Collection: 单例集合的根接口
-------| List:实现了List接口的集合类,具备的特点:有序,可重复;
----------| ArrayList:底层是维护了一个Object数组实现的;特点:查询速度快,增删慢;
----------| LinkedList:底层是使用了链表数据结构实现的;特点:查询速度慢,增删快;
----------| Vector(了解即可):底层也是维护了一个Object数组实现的,与ArrayList是一样的;但是Vector是
线程安全的,操作效率低,所以被ArrayList取代了;ArrayList不是线程同步的,操作效率高;
-------| Set:实现了Set接口的集合类,具备的特点:无序,不可重复;
----------| HashSet:底层是使用了哈希表来支持的;特点:存取速度快;
----------| TreeSet:底层使用了红-黑树的数据结构,红-黑树是一种特定类型的二叉树,规则是左小右大;
如果元素具备自然顺序的特性,那么就按照元素的自然顺序进行排序存储;
自然顺序:abcd,1234等;
TreeSet注意事项:
1、往TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素本身的自然顺序特性进行存储;
2、如果元素本身不具备自然 顺序的特性,那么该元素所属的类必须要实现Comparable接口,并重写compareTo()
方法,把元素的比较规则定义在compareTo()方法上;
3、如果比较元素的时候,compareTo()方法返回的是0,那么该元素就被视为重复元素,不允许添加;
无序:指添加元素的顺序和取出元素的顺序是不一致的;
*/
class Person implements Comparable{
int id; // 编号
String name; // 姓名
int salary; // 薪水
public Person() {
}
public Person(int id, String name, int salary) {
this.id = id;
this.name = name;
this.salary = salary;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", salary=" + salary + "]";
}
// 定义元素与元素之间的比较规则;该方法由TreeSet调用,不需要我们自己调用;
@Override
public int compareTo(Object o) {
Person p = (Person) o;
// 查看哪两个元素进行比较:
System.out.println(this.name + " compare " + p.name);
// 负数、0、正数,分别表示当前对象小于、等于、大于指定对象;
return this.salary - p.salary;
}
}
public class Demo6 {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void test1(){
TreeSet t = new TreeSet();
t.add(1);
t.add(33);
t.add(12);
t.add(9);
System.out.println("集合中的元素:" + t); // 集合中的元素:[1, 9, 12, 33]
TreeSet t2 = new TreeSet();
t2.add('q');
t2.add('w');
t2.add('e');
t2.add('r');
System.out.println("集合中的元素:" + t2); // 集合中的元素:[e, q, r, w]
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test
public void test2(){
TreeSet t = new TreeSet();
t.add(new Person(1, "陈一", 600));
t.add(new Person(2, "冯二", 700));
t.add(new Person(3, "张三", 300));
t.add(new Person(4, "李四", 500));
t.add(new Person(5, "王五", 200));
t.add(new Person(6, "赵六", 900));
t.add(new Person(7, "田七", 900));
// 默认情况下自定义对象元素无法确定比较规则,所以会报异常:java.lang.ClassCastException:
// com.collection.set.Person cannot be cast to java.lang.Comparable
// 当Person类实现了Comparable接口,重写了compareTo()方法,并在该方法中指定比较的规则是
// 按照薪水排序的,那么自定义对象元素就可以进行排序了;
System.out.println("集合中的元素:" + t);
}
}