泛型数组列表(ArryList):
初识编程语言就是c语言。而在c语言中,对于数组大小的判断,必须在编译的时候就确定,对此感觉
十分的苦恼,毕竟某大型公司中的大型部门,是不愿意为那些仅仅有10名的雇员的部门浪费90
名雇员占据的办公室的。
而在Java中,就允许在运行是才确定数组的大小。
int size=...;
Employee[] staff = new Employee[size];
但还未曾完全解决运行时动态改变数组的问题
这就引出这次的学习对象——ArrayList
采用类型参数(type parameter)的泛型类(generic class).
声明和构造一个保存Employee对象的数组列表:
ArrayList<Employee> staff = new ArrayList<Employee>();
使用()方法将元素添加到数组列表中:
staff.add(new Employee(.....));
且不用去担心数组的空间被用尽,因为数组列表会自动地创建一个更大的数组,听起来是高大上的,
嘻嘻
但如果在创建之前知道数组的大小,可以在填充之前调用:
staff.ensureCapacity(100);
也可以在初始状态就将容量传递给构造器。
警告:
new ArrayList<Employee>(100)
和
new Employee(100)
的分配空间是不一样的,也就是数组列表的容量和数组的大小是不一样的,其实看看他们之间
的叫法就是不一样(皮一下):
为数组分配100个元素的存储空间,其数组中就有100个空闲的位置,而容量为100个元素只是
拥有保存100个元素的潜力….
类型化与原始数组列表的兼容性
在Java SE较新的版本中,是使用类型参数的数组列表,但也有可能和程序中原始的ArrayList
进行交叉操作
简单来说就是可以将一个类型化的数组列表传递给某个方法,而且不需要进行任何类型转换。
(但这种调用是不安全的)
类型转换时将进行相同的运行时检查。
补充:
而对于泛型来说
创建泛型的时候,一定要指出类型变量T的具体类型,争取让编译器检查出错误,而不是留给JVM运行时抛出类不匹配的异常
泛型概念——类型擦除。实际上,JVM并不知道泛型,它只是在编译阶段将泛型处理成了普通类和方法,叫做类型变量T的擦除。