1、Java中的泛型集合运用

此前的ArrayList list=new ArrayList(); HashMap map=new HashMap();
list.add(1); 值类型->引用类型:装箱;
int i=(Integer)list.get(i); 引用类型->值类型:拆箱;
装箱、拆箱效率很低!
如何解决以上问题?——泛型,指定存放类型!

ArrayList<Integer> list=new ArrayList<Integer>();  //指定类型(必须是包装类型)
list.add(1);
int a=list.get(0);         //无需类型转换
System.out.println(a);

HashMap<String, Student> map=new HashMap<String,Student>();
for(int i=1;i<=10;i++)
{
Student student=new Student(i,"student"+i,"cs");
map.put(student.getStuName(), student);
System.out.println(student);
}

HashMap第二种遍历方式

for(Map.Entry<String, Student>entity:map.entrySet())
{
String key=entity.getKey();
Student value=entity.getValue();
System.out.println("Key:"+key+",value:"+value);
}

2、深入Java泛型应用
许多类方法实现的功能类似,例如只有数据类型不同,如果重新定义效率会很低,使用泛型可以解决这一问题。

定义泛型类:

//参数类型名称:T
public class Pair<T> {
private T min;
private T max;

编写泛型方法:

public static <T extends Comparable>Pair<T> Cal(T[] nums) {
    T max=nums[0];
    T min=nums[0];
    
    for(int i=1;i<nums.length;i++){
        if(max.compareTo(nums[i])<0) max=nums[i];
        if(min.compareTo(nums[i])>0) min=nums[i];
}
    return new Pair(min,max);    
}

泛型调用:

Student[] students=new Student[] {new Student(1,"zhang",20),new Student(2,"li",12),new Student(3,"wang",25)};
//static静态方法可以直接使用类.方法
Pair<Student> Res=Maxmin.Cal(students);
//学生类toString()
System.out.println(Res.getMax().toString());
System.out.println(Res.getMin().toString());

由于Student没有Comparable方法,所以下面需要实现这个接口
public class Student implements Comparable


@Override
public int compareTo(Student o) {
    return this.stuAge.compareTo(o.stuAge);
}

注意点:
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型(int/Integer);
2、同一种泛型对应多个版本(因为参数类型不确定的),不同版本的泛型类实例是不兼容的;
3、泛型的类型参数是多个,例如HashMap(K,V);
4、泛型的参数类型可以使用extends语句,例如。习惯上成为“有界类型”。
5、泛型的参数类型还可以是通配符类型
例如Class<?> classType=Class.forName(java.lang.String);

标签: none

评论已关闭