泛型:
概述:泛型是jdk5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。
格式:<数据类型>;注意:泛型只能支持引用数据类型。
集合体系的全部接口和实现类都支持泛型的使用。
1.好处:
1.1:统一数据类型。
1.2:把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为编译阶段类型就能确定下来。
2.泛型可以在类、方法、接口定义时使用。
2.1:自定义泛型类:定义类的同时定义了泛型的类。
2.1.1格式:修饰符 class 类名 <泛型变量>{}
例如:public class MyArrayList<T>{}
此处泛型变量T可以随便写为任意标识,常见的如E、T、K、V等。
2.1.2:作用:编译阶段可以指定数据类型,类似于集合的作用。(类中把出现泛型变量的地方全部替换成传输的真实数据类型)
2.2:泛型方法:定义方法时同时定义了泛型的方法就是泛型方法。
2.2.1格式:修饰符<泛型变量>方法返回值 方法名称(形参列表){}
例如:public <T>void show (T t){}
2.2.2作用:方法中可以使用泛型接受一切实际类型的参数,方法更具备通用性。(方法中把出现泛型变量的地方全部替换成传输的真实数据类型。)
2.3:泛型接口:使用了泛型定义的接口。
2.3.1:格式: 修饰符 interface 接口名称<泛型变量>{}
例如:public interface Data<E>{}
2.3.2作用:泛型接口可以让实现类选择当前功能需要操作的数据类型。(实现类可以在实现接口的时候传入自己操作的数据类型,这样重写的方法都将是针对于该类型的操作。)
3:通配符:?
3.1:在使用泛型时,?代表一切类型。
E、T、K、V是在定义泛型时使用的。
3.2:泛型的上下限:
?extends Car:?必须是Car或者其子类 泛型上限。
? super Car:?必须是Car或者其父类 泛型下限。
list类系列:
1.list系列集合特点:有序、可重复、有索引。
有序:存储和取出的元素顺序一致。
有索引:可以通过索引操作元素。
可重复:储存的元素可以重复。
2.底层:
2.1:ArrayList是基于数组实现的,根据索引查询元素快,增删相对慢。
第一次创建集合并添加信息时,默认创建一个长度为10的数组,后每次空间不足时将长度右移一位,再加上原本的长度,即扩增1.5倍。
2.2:LinkedList是基于双链表实现的,查询元素慢,增删首尾元素快。
3.遍历方式:
迭代器:(创建迭代器对象,然后写while循环。)
foreach循环。
Lambda表达式。
for循环(因为List集合存在索引。)
set集合系列:
1.特点:无序、不可重复、无索引。
HashSet:无序,不重复,无索引。
LinkedHashSet:有序、不重复、无索引。
TreeSet:排序、不重复、无索引。
底层原理:
HashSet集合底层采取哈希表存储的数据,是对于增删改查数据性能都较好的结构。
Jdk8以前底层使用数组+链表组成,之后增加了红黑树结构。
哈希表:
1.哈希值:依据对象的地址,按照一定规则算出的int类型的数值。
2.过程:
2.1:创建一个默认长度为16的数组,数组名为table,
2.2:根据元素的哈希值跟数组的长度取余计算出应存的位置。(哈希算法。)
2.3:判断当前位置是否为null,如果是null则直接存入。
2.4:如果位置不为null,表示有元素,则调用equals方法比较。
2.5:如果一样,那么表示这两者地址相同,不存入。
jdk7中,新元素占老元素位置,指向老元素。
jdk8中新元素挂在老元素下面。
map集合:
map集合是一种双列集合,每个元素包含两个数据。
每个元素的格式为“key=value”即键值对元素。
每个键都是唯一的,值为键的附属品,多个键对应的值可以相同,但是每个键都是不同的。
collection系列集合可以看做是只有键没有值的特殊map集合。