02-Collection/泛型
一、Collection
1.1、概述:
集合是java中提供的一种容器,可以用来存储多个数据。
集合和数组的区别:
数组的长度是固定的。集合的长度是可变的。
数组中存储的同一类型的元素,可以存储基本数据类型值。集合存储的是对象。且对象的类型可以不一致。本质上存的是Object类型。
1.2、集合框架:
集合按照存储接口分为两大类:
单列集合java.util.Collection和双列集合java.util.Map
Collection:
单列集合类的根接口,用于存储一系列符合某种规则的元素,两个子接口java.util.List和java.util.Set。
LIst:有序,可重复。Set无序,不可重复。
List接口的主要实现类:java.util.ArrayList 和 java.util.LinkedList。
Set主要实现类:java.util.HashSet 和 java.util.TreeSet。
1.3、Collection常用功能
Collection是所有单列集合的父接口。定义了单列集合(List\Set)通用的一些方法。
一个集合类中应该有什么方法呢?
-->添加,清除,移除,包含,为空?,大小,存储到数组
public boolean add(E e): 把给定的对象添加到当前集合中 。
public void clear() :清空集合中所有的元素。
public boolean remove(E e): 把给定的对象在当前集合中删除。
public boolean contains(E e):判断当前集合中是否包含给定的对象。
public boolean isEmpty():判断当前集合是否为空。
public int size():返回集合中元素的个数。
public Object[] toArray(): 把集合中的元素,存储到数组中。
二、Iterator迭代器
2.1、Iterator接口
java.util.Iterator。Iterator接口也是Java集合中的一员。
想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作。
public Iterator iterator():获取集合对应的迭代器,用来遍历集合中的元素的。
迭代的概念:
即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
Iterator接口常用方法:
public E next():返回迭代的下一个元素。
public boolean hasNext():如果仍有元素可以迭代,则返回 true。
tips:在进行集合元素取出时,如果集合中已经没有元素了,还继续使用迭代器的next方法,将会发生java.util.NoSuchElementException没有集合元素的错误。
2.2、迭代器的实现原理
调用类型为 t 集合的iterator()方法获得迭代器对象
然后使用 hashNext() 方法判断集合中是否存在下一个元素
如果存在,则调用 next() 方法将元素取出
否则说明已到达了集合末尾,停止遍历元素
Iterator迭代器对象遍历集合时,内部采用指针方式来跟踪集合中的元素。
2.3、增强fo循环
增强for循环(也称 for-each 循环)是 JDK1.5 后的新特性。专门用来遍历数组和集合的。
内部原理:其实是个 Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。
格式:for(元素的数据类型 变量 : Collection集合or数组){ //写操作代码 }
三、泛型
3.1、概述
集合中是可以存放任意对象的,只要把对象存储在集合后,那么这是它们就会被提升成 Object 类型。
当我们取出一对象,进行相应操作,这时必须采用类型转换。
Collection虽然可以存储各种类型对象,但是实际上通常Collection只存储同一类型的对象。
JDK5后,新增了泛型(Generic)语法,在设计API时可以指定类或方法支持泛型。这样在使用API的时候也变得更加简洁,并得到编译时期的语法检查。
泛型:
可以在类或方法中预支地使用未知的类型。
tips:
一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。
3.2、使用泛型的好处
1、将运行时期的ClassCastException,转移到编译时期编程编译失败。
2、避免类型强转的麻烦。
tips:
泛型是数据类型的一部分,我们将类名与泛型合并一起看做数据类型。
3.3、泛型的定义和使用
泛型用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。
3.3.1、定义和使用含有泛型的类:
定义格式:
修饰符 class 类名<代表泛型的变量> { }
在创建对象的时候确定泛型。
3.3.2.含有泛型的方法
定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ } ==> < T >放在返回值类型前面
在调用方法时,确定泛型的类型。
3.3.3、含有泛型的接口
定义格式:
修饰符 interface 接口名<代表泛型的变量> { }
1、在创建类时确定泛型的类型。
2、或者始终不确定泛型的类型,直到创建对象时,才确定泛型类型。
==>如public class MyImp2<E> implements MyGenericInterface<E>
MyImp2<String> my = new MyImp2<String>(); my.add("aa");
3.4、通配符
当使用泛型类或者接口时,传递的数据中,泛型数据不确定,可使用通配符<?>表示。
使用了泛型通配符后,只能使用Object类中共性方法。集合中元素类型自身方法无法使用。
3.4.1、通配符的基本使用
泛型的通配符:
不知道使用什么类型的数据类接收的时候,此时可以使用?,?表示通配符。此时只能接收数据,不能往该集合中存储数据。
3.4.2、通配符的高级使用-->受限泛型
泛型的上限:
格式:类型名称<? extends 类> 对象名称
意义:只能接收该类型其子类
泛型的下限:
格式:类型名称<? super 类> 对象名称
意义:只能接收该类型及其父类型
泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}

浙公网安备 33010602011771号