泛型:
概述:
一种特殊的类型,是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的类型;
格式:
<数据类型>(只能是引用类型);
好处:
把运行时期的问题提前到了编译时期,避免了强制类型转换,优化了程序设计,解决了黄色警告线(eclipse);
泛型应用:
泛型类:
把泛型定义在类上;
格式:public class 类名<泛型,...>;
泛型方法:
把泛型定义在方法上;
格式:public <泛型类型> 返回类型 方法名(泛型类型);
泛型接口:
把泛型定义在接口上;
格式:public interface 接口名<泛型>
泛型高级:
通配符:
泛型通配符:<?>:表示任意类型,如果没有明确,那么就是Object以及任意类型的java类了;
<? extends E>:向下限定,E及其子类;
<? super E>:向上限定,E及其父类;
泛型如果明确写,前后必须一致;
静态导入:
格式:
import static 包名...类名.方法名;
可以直接导入到方法的级别;
注意事项:
方法必须是静态的;
如果有多个同名的静态方法,容易不知道使用哪一个,这个时候要使用,必须加前缀,由此可见,意义不大,所以一般不用;
可变参数:
概述:
定义方法时不知道该定义多少个参数时使用;
格式:
修饰符 返回值类型 方法名(数据类型...变量名){};
注:这里的变量其实是个数组;
如果一个方法有可变参数,且有多个参数,那么可变参数肯定是最后一个;
Set:
一个不包含重复元素的Collection集合;
HashSet:
不保证set的迭代顺序;
特别是它不保证该顺序恒久不变;
HashSet如何保证元素唯一性:
底层数据结构是哈希表(元素是链表的数组),哈希表依赖于哈希值存储
首先比较数据之间的哈希值;
如果相同,继续比较地址值或者内容,如果不同,就直接添加入集合
注意:如果有特殊需要,建议重写equals和hashCode方法,比如保证引用类型的唯一性;
LinkedHashSet:
元素有序唯一;
由链表保证元素有序;
由哈希表保证元素唯一;
TreeSet:
概述:
使用元素的自然顺序对元素进行排序或者根据创建时提供的Comparetor进行排序,具体取决于使用的构造方法;
如何保证元素的排序和唯一性:
底层结构为红黑树(红黑树是一种自平衡的二叉树);
存储:
当第一个元素存储的时候,直接作为根节点存储;
从第二个元素开始,每个元素从根节点开始比较
大 作为右分支;
小 作为左分支;
相等 不存入;
取出(前后遍历,中序遍历,后序遍历):
从根节点开始,根据左,中,右的原则依次取出元素即可;