------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
概述:
Iterator:对 collection 进行迭代的迭代器。
泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
一、迭代
Iterator接口:取代了 Java Collections Framework 中的 Enumeration。
特点:
- 是取出集合元素的一种方式。
- Collection中有iterator方法,故每一个子类集合对象都具备迭代器
- 迭代器中的next方法是自动向下取元素,要避免出现NOSuchElementException
- next方法返回值的类型是Object,故要进行类型转换
- 使用集合子类对象调用iterator()要求容器返回一个Iterator,第一次调用Iterator的next()方法时,它返回序列的第一个元素。
- iterator()方法是java.lang.Iterable接口被Collection继承。
- 使用next()方法获得序列的下一个元素
- 使用hashNext()检查序列中是否还有元素
- 使用remove()将迭代器新返回的元素删除。
迭代器与枚举有两点不同:
- 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
- 方法名称得到了改进。
二、泛型
泛型格式:通过<>来定义要操作的引用数据类型。
优势:
- 将运行时期出现问题ClassCastException,转移到了编译时期,方便于程序员解决问题。让运行时问题减少,安全。
- 避免了强制转换麻烦。
泛型类适用于:当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来完成扩展。泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。<>放在类名后面。
泛型方法适用于:让不同方法可以操作不同类型,而且类型还不确定。<**>放在修饰符后面,返回值前面
注意:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
泛型接口:假设泛型接口Inter<T>,那么实现泛型接口的类可以这样表示
- 如果指定参数类型String,则表示为class InterTemp implements Inter<String>;
- 如果不指定参数类型,则表示为class InterTemp<T> implements Inter<T>;
<?>中的?用于不明确类型的情况下。?是通配符,占位符。
泛型限定:
- 上限即向上限定,格式为<? extends E>,可以接受E类型或者E的子类型。
- 下限即向下限定,格式为<? super E>,可以接受E类型或者E的父类型。
泛型限定用于泛型扩展。
参考代码:
class GenericTest
{
public static void main(String[] args)
{
TreeSet
ts1 = new TreeSet
(new CompT());
//添加元素
ts1.add(new Student("ab3"));
ts1.add(new Student("ab02"));
ts1.add(new Student("abc6"));
ts1.add(new Student("ac01"));
Iterator
it1 = ts1.iterator();
//迭代器使用
while(it1.hasNext())
{
System.out.println(it1.next().getName());
}
TreeSet
ts2 = new TreeSet
(new CompT()); ts2.add(new Worker("wbc--03")); ts2.add(new Worker("wac--02")); ts2.add(new Worker("wab--06")); ts2.add(new Worker("wabc--01")); Iterator
it2= ts2.iterator();//迭代器的使用 while(it2.hasNext()) { System.out.println(it2.next().getName()); } } } class CompT implements Comparator
//泛型类 { public int compare(Person p1,Person p2) { return p2.getName().compareTo(p1.getName()); } } class Person { private String name; Person(String name) { this.name = name; } public String getName() { return name; } public String toString() { return "person :"+name; } } class Student extends Person { Student(String name) { super(name); } } class Worker extends Person { Worker(String name) { super(name); } }