Collection集合
java.util.Collection接口
所有单列集合的最顶层的接口,里边定义了所有单列集合共性的方法
任意的单列集合都可以使用Collection接口中的方法
共性的方法:
(1)public boolean add(E e):把给定的对象添加到当前集合中
注意:返回值是一个boolean值,一般都返回true,所以可以不用接收
例如: Collection<String> coll = new ArrayList<>();
coll.add("张三");
(2)public void clear():清空集合中所有的元素
注意:但是不删除集合,集合还存在
例如: coll.clear();
System.out.println(coll);//[]
(3)public boolean remove(E e):把给定的对象在当前集合中删除
注意:返回值是一个boolean值,集合中存在元素,删除元素,返回true;
集合中不存在元素,删除失败,返回false
例如: boolean b3 = coll.remove("赵四");
(4)public boolean contains(E e):判断当前集合中是否包含给定的对象
注意:包含返回true;不包含返回false
例如: boolean b4 = coll.contains("李四");
(5)public boolean isEmpty():判断当前集合是否为空
注意:集合为空返回true,集合不为空返回false
例如: boolean b6 = coll.isEmpty();
(6)public int size():返回集合中元素的个数
例如: int size = coll.size();
(7)public Object[] toArray():把集合中的元素,存储到数组中
例如: Object[] arr = coll.toArray();
Iterator接口
java.util.Iterator接口:迭代器(对集合进行遍历)
有两个常用方法
(1)boolean hasNext() 判断集合中还有没有下一个元素,有就返回true,没有就返回false
(2)E next() 取出集合中的下一个元素
Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口实现类对象,获取实现类的方式比较特殊
Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
Iterator<E> iterator() 返回在此collection的元素上进行迭代的迭代器
迭代器的使用步骤(重点):
1. 使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
2. 使用Iterator接口中的方法hasNext判断还有没有下一个元素
3. 使用Iterator接口中的方法next取出集合中的下一个元素
注意:
1. Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
2. 使用迭代器取出集合中元素的代码,是一个重复的过程,所以我们可以使用循环优化。
不知道集合中有多少元素,使用while循环。循环结束的条件,hasNext方法返回false。
3. 没有元素,在取出元素会抛出 NoSuchElementException没有元素异常
例如: Iterator<String> it = coll.iterator(); //【获取迭代器的实现类对象,并且会把指针(索引)指向集合的-1索引】
while(it.hasNext()) { //【判断集合中还有没有下一个元素】
String e = it.next(); //【做了两件事:1. 取出下一个元素;2. 会把指针向后移动一位】
System.out.println(e);
}
增强for循环
增强for循环:底层使用的也是迭代器,使用for循环的格式,简化了迭代器的书写
是JDK1.5之后出现的新特性
Collection<E>extends Iterable<E>:所有的单列集合都可以使用增强for
public interface Iterable<T> 实现这个接口允许对象成为“foreach”语句的目标
增强for循环:用来遍历集合和数组
格式:
for(集合/数组的数据类型 变量名: 集合名/数组名) {
System.out.println(变量名);
}
注意:新for循环必须有被遍历的目标。目标只能是Collection或者是数组。新式for仅仅作为遍历操作出现。
例如: private static void demo01() {
int[] arr = {1, 2, 3, 4, 5};
for(int i: arr) {
System.out.println(i);
}
}
增强for循环 arr.for
泛型
泛型:是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型。
泛型也可以看成是一个变量,用来接收数据类型
E e:Element 元素
T t:Type类型
ArrayList集合在定义的时候,不知道集合中都会存储什么类型的数据,所有类型使用泛型。
E:未知的数据类型
public class ArrayList<E>{
public boolean add(E e){}
public E get(int index){}
}
创建集合对象的时候,就会确定泛型的数据类型
ArrayList<String> list = new ArrayList<String>();
会把数据类型作为参数传递,把String赋值给泛型E
public class ArrayList<String>{
public boolean add(String e){}
public String get(int index){}
}
创建集合对象,使用泛型
好处:
1. 避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2. 把运行期异常(代码运行之后会抛出的异常),提升到了编译器(写代码的时候会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
例如: ArrayList<String> list = new ArrayList<>();
list.add("abc");
创建集合对象,不使用泛型
好处:
集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据
弊端:
不安全,会引发异常
例如: ArrayList list = new ArrayList();
list.add("abc");
list.add(1);