1,单词:genericity泛型,Integer 整数。Iterator 迭代器。Listlterator列表迭代器 previous,逆序,早先的 Collection,采集,聚集 parameter 参数 random 随机的,任意的 vector 矢量航线 ArrayList(数组列表)表示动态数组 satck 栈 Heap 堆 Generic 泛型
Wildcard 通配符 enhance 增强 item条款,项目 nest嵌套 dummy,仿制品,傀儡
Comparable可比较的,比得上的 comparator比较器
2,泛型:
• (1)为什么会有泛型呢?
– 通过案例引入
早期(jdk1.5之前)的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题(向下类型转换)。也就存在这安全隐患(ClassCastException),所以Java提供了泛型来解决这个安全问题
(2)自定义一个泛型类型
*
* 格式:
*
* public class 类型名 <泛型类型1,....>
* T: Type
* E: Element
* K: Key
* V: Value
* @author jerry
*
*/
public class GenericClassA<T> { // 可以将类的泛型,想象成类的形式参数
(3)自定义泛型方法
*
* 泛型方法方法的格式: public <泛型类型> 方法返回值类型方法名(泛型类型){ 代码块 }
public <T> void method1(T t) {
System.out.println(t.toString());
}
public<T1, T2> void method2(T1 t1, T2 t2) {
System.out.println(t1.toString());
System.out.println(t2.toString());
}
(4)泛型接口
*
* 格式:
*
* public interface接口的名 <泛型类型>{}
*
*
* 注意:泛型接口,在被子类实现的时候,需要提供泛型类型。
* @author jerry
*
*/
public interface GenericInterfaceA <T> {
(5)演示泛型的格式
*
* 泛型是1.5出现。
*
* 好处:避免了程序中类型的向上类型转换,和向下类中转换,提高了程序的安全性。
*
* 泛型是在编译的时候,做的事情。
* 真正程序的执行的时候,可以没有泛型信息。(.class中没有泛型信息)
* while(listIter.hasNext()){
//泛型情况下,不再需要向下类型转换。
//也就避免了向下类型转换时,容易出现的异常ClassCastException 。
Stringstr = listIter.next();
System.out.println(str);
}
(6)泛型的通配符应用:
*
* 1:?
* 格式:ArrayList<?>al = new ArrayList<String>();
* -> 表示所有类型,当然可以是Object类型了。也可以是null
,
ArrayList<?>al5 = new ArrayList<>();//都可以
// ArrayList<?>al6 = new ArrayList<?>();//通配符,出现在等式 左边
//jdk1.7中 提供了一种新的语法,类型推断
ArrayList<String>al = new ArrayList<>();//类型推断
//副作用:不能存或者更新,只能取
//Themethod add(capture#1-of ?) in the type ArrayList<capture#1-of ?> is notapplicable for the arguments (String)
// al1.add("jerry");
// al1.add(newStudent("jerry",20));
al1.get(1);
/应用场景:出现在方法的形式参数中,以及方法的返回值类型
(7)泛型的通配符应用:
*
* 1:?
* 格式:ArrayList<?> al = new ArrayList<String>();
* -> 表示所有类型,当然可以是Object类型了。也可以是null
*
* 2:? extends E
* 格式:ArrayList<? extends Person > al1 = newArrayList<Person>();
* -> 向下限定,E及其子类
* //副作用:不能往里存或者更新,只能往外取
//应用场景:出现在方法的形式参数中,以及方法的返回值类型
* 3:? super E
* 格式:ArrayList<? super Person > al1 = newArrayList<Person>();
* -> 向上限定,E及其父类
副作用:不影响往里存,但往外取只能放在Object对象里
//应用场景:出现在方法的形式参数中,以及方法的返回值类型
3,增强for
格式:
* for(数据类型变量名(对象) : 数组or集合){
* 这里可以直接拿变量名来作为集合元素使用
* }
if(al!=null){
// 增强for(增强for其实就是一种"语法糖")
for(String item : al){
// item 作为集合元素来对待
System.out.println("集合元素:"+item);
}
}
// 建议大家多用增强for,因为简单
//增强for遍历数组
int[] array = new int[]{1,2,3};
for(int item : array){
System.out.println("数组元素:"+item);
}
4,可变参数
格式:
* 作为方法的形式参数出现
* 修饰符返回值方法名(数据类型... 变量名){
*
* }
*
* 注意事项:
* 1:可变参数其实是一个数组处理
* 2:可变参数必须作为整个方法的最后一个形式参数出现(位置是最后一个位置)
A: //工作中很常见的需求:将数组类型转化为列表集合类型
List<Integer> list = Arrays.asList(1,2,3);
B;// 如何将列表集合转化为数组呢?
Integer[] array1 = list.toArray(new Integer[0]);
System.out.println(Arrays.toString(array1));