java泛型高级用法(java基础泛型collections工具类及comparable)
java泛型高级用法(java基础泛型collections工具类及comparable)B eat(A a); public interface Pet<A B> { 接下来我们看一下泛型接口的语法:[访问修饰符] interface 接口名<类型形参> { [修饰符] 返回类型 方法名(类型形参 类型形参实例);}
各位读者老爷们,图图又来了,话不多说,让我们直接跳进学习里吧!
JDK5.0之后,引入泛型的概念。泛型的本质为:参数化类型,也就是用附属参数的形式,达到一种修饰限定类型的目的。泛型的语法:可以在接口、类、方法上声明泛型约束,用<>表示,泛型名称我们一般习惯用一个大写字母表示,如E、K、V。泛型只是一种类型约束、限定,在声明时,这些大写字母没有实际意义,也不代表任何类型,相当于Object。在使用时,会根据创建传入的实际类型,从而进行擦除替换。
List接口可以容纳Object类型的数据,方便存放各种类型的数据。但是,当我们放入一些很明确的数据类型,如String、News时,会自动向上提升为Object类型,获取时需要强转,不过强转的话会存在安全隐患。如果没有类型限制,List接口中可以同时存放Student、Dog等不同类型,获取数据极为不便。
有了泛型之后呢,存入集合的数据会自动向上提升为Object,集合中也可以同时放入不同类型的数据。我们需要注意的是,除了限定了集合中的类型外,泛型集合的所有操作和之前都是相同的。
接下来我们看一下泛型接口的语法:[访问修饰符] interface 接口名<类型形参> {
[修饰符] 返回类型 方法名(类型形参 类型形参实例);
}
public interface Pet<A B> {
B eat(A a);
void sleep();
}
以及泛型类的语法:[访问修饰符] class 类名<类型形参> {
[修饰符] 返回类型 方法名(类型形参 类型形参实例);
}
public class Cat<C> {
private C c;
public void catching(C c) { this.c = c; }
public C getC() { return c; }
}
还有泛型方法的语法:[访问修饰符] <类型形参> 返回值 方法名(不指定|类型形参|正常参数 ……) {
}
public <D E> void test(D d E[] e int age) {
System.out.println(d.getClass());
System.out.println(e.getClass());
}
那么泛型又有什么限制呢?首先泛型接口和泛型实现类约束的类型参数必须严格一致;泛型接口,泛型类中的类型参数,可以通过extends规定更加严格的传参限定;泛型方法中,我们可以使用?的形式对集合类型的参数里面的内容作更加严格的类型限定。
Iterator接口是所有实现了Collection接口的集合类都有一个iterator()方法,用以返回一个Iterator接口类型的实例对象。它的操作原理是专门的集合迭代输出接口。所谓的迭代输出就是依次判断集合中有没有下一个元素,有的话输出,一直到集合的末尾。Iterator对象我们称作迭代器,用来实现对集合内元素的操作。Iterator接口中定义了如下方法:boolean hasNext(); //判断游标右边是否有元素;Object next() ; //返回游标右边的元素并将游标移动到下一个位置;void remove(); //删除游标左边的集合中的元素,要在next()之后使用,删除后集合将会受到影响。
Collections类:Java提供的操作集合的工具类,位于java.util包下,类中的方法均为static。void sort(List list):按照自然顺序进行排序。List列表中的所有元素都必须实现Comparable 接口。void shuffle(List list):对List列表内的元素进行随机排列;void reverse(List list):对List列表内的元素进行反转;int binarySearch(List list Object obj):在指定列表中查找指定对象,需要先对列表进行sort;void fill(List list Object obj):使用指定元素替换指定列表中的所有元素。
Comparable接口定义排序顺序具有局限性。实现此接口的类只能按compareTo(T t)定义的这种方式排序。如果一个类的对象要有多种排序方式,我们可以为该类定义不同的比较器。
河海不择细流,故能就其深。学习亦然。最后图图依旧祝福读者老爷们都能够事情爱情两开花~~~