Collection集合、Iterator接口(迭代器)、泛型
集合
1、数组的缺陷:长度不可变,只能存储一种类型的数据。
2、集合:长度可变,存储的是对象,可以存储不同类型的数据。
Collection集合
1、所有集合的父类接口,根据集合类型不同又分为两个子接口list接口和set接口,每个子接口下有多个实现类集合。
2、常用方法:
Boolean add(E e);向集合中添加元素。
Boolean remove(E e);删除集合中的某个元素。
void clear();清空集合中的所有元素。
Boolean contains(E e);判断集合中是否包含某个元素。
Boolean isEmpty();判断集合是否为空。
int size();获取集合的长度。
Object[] toArray();将集合转换成一个数组。
3、Collection集合有个工具类Collections里面有大量的静态方法,可以对Collection的子类进行操作,如public static void shuffle(List<?> list); 使用默认的随机源随机排列指定的列表,即将集合内的元素随机打乱。
Iterator接口(迭代器)
1、对集合进行遍历。
2、常用方法:
boolean hasNext()如果仍有元素可以迭代,则返回true,否则返回false。
E next()返回(取出)迭代的下一个元素。
3、Iterator是接口不能直接创建对象,一般通过子类来使用:
Iterator<E> it = Collection的实现类.iterator();
4、增强for循环:底层也是使用迭代器实现,只能遍历,不能在遍历过程中进行元素的增删。
格式:for(集合(数组的数据类型) 变量名 : 集合名(数组名)){}
泛型
1、未知的数据类型,当我们不知道该用什么类型时就可以使用泛型,泛型也可以看作一个变量,用来接收数据类型。
2、泛型的好处与弊端:
好处:避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型。把运行时异常提升到了编译期。
弊端:泛型是什么类型就只能存储什么类型。
3、泛型的定义与使用:
定义含有泛型的类:public class 类名<E>{private E 变量名;public E get(){return 变量名;}public void set(E e){this.变量名 = e;}}
定义含有泛型的方法:修饰符 <E> 返回值类型 方法名(E e){方法体},含有泛型的方法在调用方法时确定泛型的数据类型,参数传递什么数据类型,泛型就是什么数据类型。
4、泛型接口的两种使用方法:
在实现类指定接口的泛型的数据类型:public class 实现类名称 implements 接口<String>{}。
在实现类不指定接口泛型而在创建实现类对象时指定:public class 实现类名称<E> implements 接口<E>{}。
5、泛型通配符:?代表任意的数据类型。
使用方式:不能创建对象使用,只能作为方法的参数使用。如
public void printArray(ArrayList<?> list){
Iterator<?> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
6、泛型通配符的高级模式(受限泛型):
泛型的上限:
格式:类型名称<? extends 类> 对象名称。
意义:只能接收该类型及其子类型。
泛型的下限:
格式:类型名称<? super 类> 对象名称。
意义:只能接收该类型及其父类型。