1.集合概述
在Java API中,从1.5版本开始,提供了一些常用的集合类,包括List、Set和Map,其中List和Set实现了Collection的接口。这些集合类也叫作容器,用于存放类对象的引用。注意:List、Set和Map也是接口关系如下:
这些接口的特征如下:
1.Collection接口是List接口和Set接口的父接口,一般不直接使用
2.List接口不允许存放重复的对象,并且按照对象插入的顺序排列
3.Set接口不允许存放重复对象,并且按照自身内部的排序规则排列
4.Map接口按照“键 ---- 值”的形式存放对象,其中键对象不能重复,值对象可以重复,且按照自身的排序规则排列
这些集合类在java.util包中,如果程序中应用到这些类,就需要导入这个包
在java中这些集合类或者接口都已泛型的形式出现
2.泛型
“泛型”就是把定义变量、对象的类型成为参数,也就是“参数化类型”,在方法调用时要把实参传递给形参。类似方法设计中的形参,在设计类的时候,也可以把类型作为参数,也就是“类型形参化”;然后在对象实例化或者方法调用时,传入具体的类型,这种设计叫作泛型。泛型可以应用于类、接口和方法设计中,他们分别叫作泛型类、泛型接口和泛型方法
注意在泛型设计中。作为类型的实参必须是复合数据类型
2.1泛型类的应用
class Coordinate<T1,T2>{
T1 x;
T2 y;
public T1 getX() {
return x;
}
public void setX(T1 x) {
this.x = x;
}
public T2 getY() {
return y;
}
public void setY(T2 y) {
this.y = y;
}
@Override
public String toString() {
return "Coordinate [x=" + x + ", y=" + y + "]";
}
}
public class Test {
public static void main(String[] args) {
Coordinate<Integer,Long>p1=new Coordinate<Integer,Long>();
p1.setX(10);
p1.setY(15L);
Coordinate<String,String>p2=new Coordinate<String,String>();
p2.setX("横坐标10");
p2.setY("纵坐标15");
System.out.println(p1);
System.out.println(p2);
}
}
Coordinate [x=10, y=15]
Coordinate [x=横坐标10, y=纵坐标15]
在类Coordinate的后面有T1和T2,这是泛型参数,放在类名后面的尖括号中,参数之间用“,”隔开。泛型参数可以有多个,根据实际生产中得到,且泛型参数名应符合Java标识符的要求
类名后面尖括号定义的T1和T2为两种类型,具体的类型在设计中不能够确定,这是泛型的本意
格式如下:
类名<类型实参列表>对象名=new 构造方法<类型实参列表>(实例化实参);
2.2泛型方法的应用
public class Test {
public static void main(String[] args) {
Integer[] intE= {1,2,3,4,55,66,89};
System.out.println("max="+getMax(intE)+'\t'+intE.getClass());
Double [] doubleE= {11.22,22.33,44.33,66.33};
System.out.println("max="+getMax(doubleE)+'\t'+doubleE.getClass());
}
public static<T extends Number>T getMax(T array[]){
T max=array[0];
for(T element:array) {
max=element.doubleValue()>max.doubleValue()?element:max;
}
return max;
}
}
max=89 class java.lang.Integer;
max=66.33 class java.lang.Double;
在定义方法时,引入了泛型,这种方法叫泛型方法
在这种方法中,定义了一个泛型参数T,并用T定义方法返回值类型和形参类型,同时可以用T定义局部变量max以及循环变量element的类型
在 public static<T extends Number>T getMax(T array[]) 这里使用了泛型范围限制,叫做泛型上下界
2.3泛型接口
例如:定义一个带泛型的Classroom接口,定义一个activity抽象方法,然后使用Teacger类和Student类实现Classroom接口
interface Classroom<T>{
String activity(T action);
}
//接口实现
class Teacher implements Classroom<Teaching>{
String name;
public Teacher(String name) {
super();
this.name = name;
}
@Override
public String toString() {
return name+activity(new Teaching());
}
@Override
public String activity(Teaching T) {
return T.action();
}
}
class Student implements Classroom<Learning>{
String name;
public Student(String name) {
super();
this.name = name;
}
@Override
public String activity(Learning L) {
return L.action();
}
@Override
public String toString() {
return name+activity(new Learning());
}
}
class Teaching{
public String action() {
return("正在来的路上");
}
}
class Learning{
public String action() {
return("正在上课");
}
}
public class Test{
public static void main(String[] args) {
Teacher tea=new Teacher("老师");
System.out.println(tea);
Student stu=new Student("学生");
System.out.println(stu);
}
}
老师正在来的路上
学生正在上课
总结出泛型接口的格式:
interface 接口名称<泛型参数>{
接口体
}
实现接口的类格式:
class 类名 implements 接口名<泛型参数>{
类体
}
在这里的泛型参数是用自定义的类型