就业班Day02课堂小记
java.util.Collection<E>接口:
// 成员方法(子类都会实现)
boolean?add(E?e): 把给定的对象添加到当前集合中
void?clear(): 清空集合中所有的元素
boolean?remove(E?e): 把给定的对象在当前集合中删除
boolean?contains(E?e): 判断当前集合中是否包含给定的对象
boolean?isEmpty(): 判断当前集合是否为空(没有元素)
int?size(): 返回集合中元素的个数
Object[]?toArray(): 把集合中的元素,存储到数组中
Iterator<E> iterator(): 获取集合的迭代器对象
java.util.Iterator<E>接口: 迭代器
// 成员方法
boolean hasNext(): 判断是否有下一个元素
E next(): 获取下一个元素
void remove(): 删除调用完next()指向的元素
java.util.Collections工具类
// 静态方法
static void shuffle(List<?> list): 随机打乱集合中元素的顺序
迭代器的并发修改异常:
1.使用迭代器的过程中,修改了集合的长度(添加或删除元素)就会抛出并发修改异常
2.并发,两件事同时发生(1.迭代,2.修改集合长度)
解决并发异常的解决
增强for循环:
底层使用的也是迭代器,使用for循环格式,简化了迭代器的书写
Collection<E>接口extend Iterable<E>接口
泛型的使用:
创建集合对象,不使用泛型
好处:
集合不使用泛型,默认的数据;类型就是Object类型,可以存储任意数据类型的数据
弊端:
不安全,会引发异常
创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储数据类型是什么类型,取出就是什么数据类型
2.把运行期异常(代码运行之后会抛出异常,提升到了编译期(写代码的时候回报错))
弊端:
泛型是什么类型,只能存储什么类型数据
泛型类的定义与使用
泛型是一个位置的数据类型,当我们不确定什么数据类型的使用,可以使用泛型
泛型可以接收任意的数据类型
创建对象时确定泛型的数据类型
定义格式:
修饰符 class 类名 <泛型的名字>{
}
定义含有泛型的方法与使用
定义含有泛型的方法:泛型定义在方法的修饰符和返回值类型之间
格式:
修饰符 <泛型> 返回值类型 方法名 (参数列表){方法体}
含有泛型的方法,在调用方法的时候就确定泛型的数据类型
传递什么类型的参数,泛型就是什么类型
静态方法也可以使用fan泛型
注意:静态方法也可以用对象调用,用类名也可以调用
定义与使用含有泛型的接口
修饰符 interface 接口名<代表泛型的量>{
}
实现类实现了接口以后有两种选择
1.定义接口的实现类,实现接口,并直接指定接口的泛型
2.接口使用什么泛型,实现类就使用什么泛型,类直接跟着接口走
就相当于定义一个含有泛型的类,创建对象的时候确认泛型的数据类型
泛型通配符
?:代表任意的数据类型
使用方式:
不能创建对象使用,只能作为方法的参数使用
List<?> list = new ArrayList<String>();
注意:真正创建对象是右边new语句,如果左边已经声明,那么右边不写,系统可以自动填充,如果左边没有声明,那么右边必须声明,不能省略
定义一个方法,能遍历所有类型的ArrayList集合
这时候不知道ArrayList集合使用什么数据类型,可以使用泛型通配符?来接收数据
注意:
泛型没有继承的概念
泛型的限定
上限的限定:?extends E代表使用泛型只能是E类型的子类或E本身
下限的限定:?super E代表使用泛型只能是E类或者E的父类
Collections类
static void shuffle(List<?>list):随机打乱集合中元素顺序
|