1.set 中存放的是无序,唯一的数据
2.set不可以通过下标获取对应位置的元素的值,因为无序的特点
3.使用treeset底层实现是treemap,利用红黑数实现
4.设置元素的时候,如果是自定义对象,会查找对象中的equals和hashcode的方法,如果没有,比较的是地址
5.树中的元素是要默认排序的,如果是基本数据类型,自动比较,如果是引用数据类型的话,需要自定义比较器
比较器分类:
内部比较器
定义在元素的类中,通过实现comparable接口来进行实现
外部比较器
定义在当前类中,通过实现comparator接口来实现,但是要将该比较器传递到集合中
注意:外部比较器可以定义成一个工具类,此时所有需要比较规则如果一致的话,可以复用
如果两者同时存在,默认会使用外部比较器



泛型:
当做一些集合的统一操作的时候,需要保证集合的类型是统一的,此时需要泛型来进行限制
优点:
1、数据安全
2、获取数据时效率比较高
给集合中的元素设置相同的类型就是泛型的基本需求
使用:
在定义对象的时候,通过<>中设置合理的类型来进行实现
泛型的高级应用:
1、泛型类
在定义类的时候在类后面添加<E,K,V,A,B>,启到占位的作用,
类中的方法的返回值类型和属性类型都可以使用
2、泛型接口
第一种:在定义接口的时候,在接口的名称后添加<E,K,V,A,B>,
子类在进行实现的时候,可以不填写泛型的类型,
此时在创建具体的子类对象的时候才决定使用什么类型
第二种:子类在实现泛型接口的时候,只在实现父类的接口的时候指定父类的泛型类型即可,
此时,测试方法中的泛型类型必须要跟子类保持一致
3、泛型方法
在定义方法的时候,指定方法的返回值和参数是自定义的占位符,可以是类名中的T,也可以是自定义的
Q,只不过在使用Q的时候需要使用<Q>定义在返回值的前面 public<Q> void show(Q q);
4、泛型的上限 (工作中基本用不到)
5、泛型的下限 (工作中基本用不到)