#**Collection**
java.util.Collection:接口
单列集合的根接口,里面定义的方法,子接口/实现类都有
java.util.List:接口
特点:
——有序
——有索引
——可重复
java.util.Set:接口
特点:
——无序(不保证输入和取出元素的顺序是一致)
——无索引
——不可重复
我们学习的是接口/父类,使用的是实现类/子类
Collection集合的常用方法:
—public boolean add(E e):把给定的对象添加到当前的集合对象
—public boolean contains(Object obj):判断当前集合中是否包含给定的对象
—public boolean isEmpty():判断当前集合是否为空
—public int size():返回集合中的元素个数
—public boolean remove(E e):把给定的对象在当前集合中删除,只删除一个元素
—public Object[ ] toArray():把集合中的元素,存储到数组
—public void clear():清空集合中所有的元素
关于集合和数组的区别:
1,集合和数组都是容器,可以存储多个数据
2,数组的长度是固定的,集合的长度可以改变
3,数组中存储的是同一类型的元素,可以存储任意类型。集合存储的都是引用数据类型,如果想存储基本数据类型数据需要存储对应的包装类型(引用数据类型)。
问题:并不是所有的集合都有索引,以前使用的for+get方法(索引)遍历集合的方式不行了?
解决:jdk提供了一种遍历集合的通用格式(遍历集合的工具):迭代器
迭代器接口:java.util.Interator
抽象方法:
<1>public abstract boolean hasNext():判断是否具有下一个元素,有返回true,没有返回false
<2>public abstract E next():获取下一个元素
<1>public abstract void remove():删除一个元素
单列集合根接口java.util.Collection里面定义抽象方法,获取迭代器
public abstract Iterator iterator():返回在此collection的元素上进行的迭代器,返回值类型:Iterator是一个接口
注意:java.util.ArrayList类,实现了Collection接口,必然覆盖重写抽象方法iterator(),但是由于该方法的返回值类型,是Iterator接口类型,所以ArrayList类,在覆盖重写iterator()方法时,必须想办法,返回Iterator接口的实现类对象
迭代器的基本使用:
1,创建集合对象,存储多个元素
2,集合对象调用iterator方法,获取迭代器对象
3,迭代器对象调用hasNext方法,判断是否有下一个元素
4,如果有下一个元素,迭代器对象调用next方法,取出下一个元素
5,如果没有,结束遍历
关于增强for遍历数组和集合方面
增强for循环(也称for each循环)是JDK1.5以后出来的高级for循环,专门用来遍历数组和集合
增强for遍历数组:
格式:
for(数组中存储元素的类型 变量名称:数组名){
…
}
注意:
1,增强for遍历数组底层使用的是普通for
2,增强for遍历数组,尽量不要完成对数组的增删改,否则会出问题
3,快捷键:数组名.for(使用IDEA)
增强for遍历集合
格式:
for(集合中存储元素的类型 变量名称:集合名){
…
}
注意:
1,增强for遍历集合底层使用的是迭代器
2,增强for遍历集合,尽量不要完成对集合的增删改,否则会出问题
3,快捷键:集合名.for(使用IDEA)
#**泛型**
泛型的好处:
1,避免强制类型转换的麻烦
2,将运行时异常,提前到编译时异常,降低工作量
3,一旦指定泛型,数据类型将被统一
4,实现代码的模块化,把数据类型当做参数传递
泛型可以定义的位置:类上,接口上,方法上
关于泛型定义在类上的使用
1,格式:
public class 类名<泛型变量>{
…
}
泛型变量:一般使用大写字母表示:E,T,K,V
2,在类上定义的泛型,什么时间确定具体的类型呢?
创建对象的时,<>中写的是什么类型,泛型就代表什么类型
注意:在泛型类的内部,可以直接使用泛型,提前使用未知的类型
关于泛型定义在方法上的使用
泛型方法(方法上定义了属于方法自己的泛型)
1,格式:
修饰符 返回值类型 方法名称 (T t,参数列表…){
…
}
注意:前面在定义泛型,后面方法参数:T t 在使用泛型
2,方法上定义的泛型,什么时间确定具体的类型?
调用方法时,()中写的是什么类型,泛型就代表什么类型
关于泛型定义在接口上的使用
1,格式:
public interface 接口名称{
…
}
2,接口上定义的泛型什么时间确定具体的类型呢?
<1>定义实现类时,直接确定接口上泛型的具体类型
<2>定义实现类时,不确定接口上的泛型的具体的类型,那么该实现类必须定义为泛型类,而且实现类上的泛型变量要和接口上的泛型变量名称一致,创建实现类对象时,<>中写的是什么类型,那么泛型就是什么类型(这叫做泛型的传递)
关于泛型通配符的使用
泛型通配符:? 代表任意的一种引用类型,只能用来匹配泛型,不能用来定义泛型
注意:
1,泛型不存在多态,创建集合对象时,左右两边的<>中的内容要保持一致
2,ArrayList<?> list 可以接受什么?
可以接受ArrayList的任意泛型对象(只要在创建ArrayList集合对象中<>写上一种引用类型,都是可以的)
拓展:
泛型的上限:
? extends E:表示E类型或者E类型的任意子类型
泛型的下限:
? super E:表示E类型或者E类型的任意父类型