泛型
List:是线性结构里的线性表,所有数据组成一个线性结构,可以拿出里面的第n 个元素,也可以进行插入或删除元素。
ArrayList:获取第n个元素非常快,但是插入删除非常慢。
LinkedList:获取第n个元素非常慢,但是插入删除非常快。
ArrayList与LinkedList是从List的结构来划分的,IntArrayList与StringArrayList,IntLinkedList与StringLinkedList是从元素的类型来划分的,这是两个不同维度的东西,两个不同维度的东西组合在一起要用乘法,乘法数据增长得会很快。
所以有了泛型:
从List到List<T>
规定List中的元素只能是类型T
ArrayList<Integer>,ArrayList<String>
LinkedList<Integer>,LinkedList<String>
语法:
List<Integer> list=newArrayList<>() //java1.7,不需要newArrayList<Integer>
List<Integer>list=LinkedList.of(1,2,3);
List<Integer>list=LinkedList.newEmptyList();
Object.equals(emptyIntList,LinkedList.<Integer>newEmptyList());
class ArrayList<T>{…
public <V> voidprintList(List<V> list){…
一个“细学”极恐的问题
Java Type Erasure
1、 早期java没有泛型(所以现在要兼容)
2、 为了兼容性,在运行时将所有泛型内容Erase掉(也就是说,泛型全是写给编译器看的,过了编译器之后,生成的中间代码会把所有<T>删除)
3、 运行时:List,List<String>,List<Integer>没有区别(也就是说,什么都能往里面塞,不过既然编译器会报错就不会运行了)
运行时如何知道泛型类型
void<T> printList<List<T>list);//只能输出[1,2,3]
void<T> printList(List<T>list,class<T> elementType);//可以输出Integer listof:[1,2,3]
把List<Integer>转换成List<Object>
1、 new ArrayList<Object>(intList);//先new一个ArrayList<Object>,然后把List<Integer>里面的每一个元素取出来,放进ArrayList<Object>,因为Integer是Object,所以可以放入。数据大的时候,要开两个一样大的空间来转换,比较耗费空间。
2、 (List<Object>)(LIst)intList;//利用早期语法,转为不带<>的List,然后Integer的信息就丢失了,就可以转为所有List<T>。但是比较危险。