泛型
泛型类的定义:[修饰符]class 类名 <T>
泛型接口的定义:[public] interface 接口名<T>
泛型方法的定义:[public] [static] <T> 返回值类型 方法名 (T参数)
在实例化泛型类的过程中,实际类型必须是引用类型,即必须是类类型,不能用基本类型来替换参数T(自动包装和自动解包可以保证数据的转换)。
当一个static方法需要使用泛型能力时,必须使之成为一个泛型方法。
限制泛型的可用类型
1. extends关键字
语法:class ClassName<T extends anyClass>(anyClass是指某个类或接口)
语句可以限制当用改了创建对象时,类型实际参数必须是anyClass类或其子类或是实现了anyClass接口的类。<T>默认是Object类下的所有子类
注意:利用泛型进行实例化时,若泛型的实际参数的类之间有父子关系时,参数化后得到的泛型类并不会具有相同的父子类关系。
2.类型通配符
语法:泛型类名<? extends T> o = null
当需要在一个程序中使用同一个泛型对象名去引用不同的泛型对象时,就需要使用到通配符“?”创建泛型类对象,但条件是被创建的这些不同泛型对象的类型实参必须是某个类或是继承该类的子类又或是时间某个接口的类。
test<? extends List> x = null;
x = new test<LinkedList>();
//当对x重新复制时,只要类型实参实现了List接口即可
x = new test<ArrayList>();
此外,通配符创建的对象只能获取或删除其中的信息,不能对其加入新的信息
GeneralType<?> gen = null;
gen.setObj("陈 磊"); // 为gen对象设置信息
System.out.println(gen.getObj()); // 获取gen对象内信息
gen.setObj(null); // 删除gen对象内的信息
gen.setObj("张三丰"); // 错误,不可以为gen对象设置新的信息
注意:不能使用泛型的类型参数T创建对象,也不能用T创建数组对象。不能在静态环境中使用泛型类的类型参数T。
3. 关于继承
public class ExtendClass<T1> { }
class SubClass<T1,T2,T3> extends ExtendClass<T1> { }
SubClass类继承时可以选择保留父类的类型参数,如果没有指明可以直接使用extends ExtendClass语句进行继承声明,则SubClass类中的T1,T2,T3自动变为Object。
容器类
Collection接口的常用方法
List接口的常用方法
LinkedList类:循环双链表实现,可以任意位置插入、删除元素
ArrayList类:一维数组实现,允许所有元素,包括null,其容量会自动增大,但不能自动缩小
容器的遍历
- foreach循环语句
- 利用Collection接口中定义的toArray()方法将容器对象转为数组,再利用循环语句
- 利用size()和get()方法进行遍历
- 利用java提供的迭代功能。由可迭代接口Iterable和迭代器接口Iterator、ListIterator实现。由于Collection接口声明继承Iterable接口,因此每个实现Collection接口的容器对象都可以调用iterator()方法返回一个迭代器。
对于容器中元素的遍历次序,接口Iterable支持对List对象从前向后的遍历,但其子接口ListIterable支持对List对象的双向遍历。
public class test03
{
public static void main(String[] args)
{
List<Integer> al = new ArrayList<Integer>();
for(int i = 1;i < 5;i++)
al.add(i);
System.out.println("数组列表的原始数据:" + al);
ListIterator<Integer> listIterator = al.listIterator();
//System.out.println(listIterator.nextIndex());
listIterator.add(0); // 在序号为0的元素前添加一个元素0
System.out.println("添加数据后的数组列表:" + al);
if(listIterator.hasNext())
{
int i = listIterator.nextIndex(); // 执行该语句时i的值为1
listIterator.next(); // 返回序号为1的元素
listIterator.set(9); // 修改数组中序号为1的元素
System.out.println("修改数据后的数组列表:" + al);
}
listIterator = al.listIterator(al.size()); // 重新创建从al最后位置开始的迭代器
System.out.println("反向遍历数组列表:" + al);
while(listIterator.hasPrevious())
System.out.print(listIterator.previous() + " ");
}
}
集合接口set
HashSet
TreeSet
映射接口Map
HashMap
TreeMap