泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型
可以说是把类型像参数一样传递,具体给大家一个例子:
ArrayList< E>中的E称为类型参数变量 ArrayList< Integer>中的Integer称为实际类型参数 整个称为ArrayList< E>泛型类型 整个ArrayList< Integer>称为参数化的类型ParameterizedType
当我们编码不确定,运行时再确定的时候 可以使用到泛型
有了泛型以后:
代码更加简洁【不用强制转换】 程序更加健壮【只要编译时期没有警告,那么运行时期就不会出现ClassCastException异常】 可读性和稳定性【在编写集合的时候,就限定了类型】
其中T就是作为一个类型参数在Play被实例化的时候所传递来的参数,比如:
Play<Integer> playInteger=new Play<>();这里T就会被实例化为Integer
要注意的是,泛型只能是类类型
要注意的是:< T> 为泛型标志 (T,t)中的T为形参变量类型
ArrayList是泛型类,可以存储任意指定类型数据。
ArrayList最大的好处就是“动态”,使用时可以不必关心数组空间的大小。因为ArrayList可以根据实际存储的数据来调整数组空间的大小。
我们在访问数组时,也可以采用下标遍历的方法。
import java.util.ArrayList; public class AboutArrayList { public static void main(String args[]) { ArrayList<Integer> array = new ArrayList<>();// 初始化int 型 ArrayList 对象 array array.add(10);//增加一个int数值为10 int num=array.get(1);//取得下标为1的数值 }上面的操作方法,对于LinkedList也是同样适用的,但二者还是有区别的;
数组是连续存储结构,存储空间利用率高,支持随机定位。但是数组的空间大小是固定的,所以,对于元素的增添和删除,时间复杂度就比较高(O(n);
链表是非连续存储结构,存储空间利用率底,只能顺序定位,但空间大小可变,所以,对于元素的增添和删除,时间复杂度就很低(O(1);
所以得出一个结论:
若我们定义的存储空间,大多数是需要追加、查找 甚至是 排序操作,就用ArrayList类数组; 若我们定义的存储空间,大多数是需要数据的插入、删除等操作,就用LinkedList类数组。
HashMap类是一个“双泛型类”
Key-Value,即键值对
import java.util.HashMap; public class AboutHashMap { public static void main(String[] args) { HashMap<String, String>nameMap = new HashMap<>(); nameMap.put("0518", "东永裴"); String name = nameMap.get("0518"); System.out.println(name); } }关于HashMap,有几点需要注意:
1.键不能重复,否则会覆盖掉键对应的原来的值 2.值可以重复,甚至可以为null 3.键值对在HashMap中是无序的