泛型

泛型

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>。但是比较危险。