所有单列集合的最顶层的接口,里面定义了所以单列集合共性的方法
任意的单列集合都可以使用Collection接口中的方法
共性方法:
public boolean add(E e): 把给定的对象添加到当前集合当中
返回值是一个boolean值,一般都返回true,所以可以不用接收
public void clear(): 清空集合当中所以的元素,但是不删除集合,集合还存在
public boolean remove(E e): 把给定的对象在当前集合中删除
返回值是一个boolean值,集合中存在元素,删除元素,返回true
集合不存在元素,删除失败,返回false
public boolean contains(E e): 判断当前集合中是否包含给定的对象
包含返回true,不包含返回false
public boolean isEmpty(): 判断当前集合是否为空。
public int size(): 返回集合当中元素的个数
public Object[] toArray(): 把集合当中的元素,存到数组中
Iterator接口
迭代器(对集合进行遍历)
常用的方法:
boolean hasNext() 如果有元素可以迭代,则返回true
判断集合中还有没有下一个元素,有返回true,没有返回false
E next() 返回迭代的下一个元素
取出的集合的下一个元素
Iterator迭代器,是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊
Collection 接口中有个方法,iterator(),这个方法返回的就是迭代器的实现类对象
Iterator iterator() 返回在此collection的元素上进行迭代的迭代器
迭代器的使用步骤:
1.使用集合当中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)
2.使用Iterator接口中的方法hasNext判断还有没有下一个元素
3.使用Iterator接口中的方法next取出集合中的下一个元素
迭代器取出集合中元素的代码,是一个重复的过程
所以我们使用循环优化
不知道集合中有多少元素,使用while循环
循环结束条件,hanNext方法返回false
public class Demo01Iterator {
public static void main(String[] args) {
Collection<String> coll = new ArrayList<>();
coll.add("姚明");
coll.add("科比");
coll.add("麦迪");
coll.add("詹姆斯");
Iterator<String> it = coll.iterator();
while (it.hasNext()) {
String e = it.next();
System.out.println(e);
}
}
}
增强for循环:底层使用的也是迭代器,使用for循环格式,简化了迭代器的书写
Collection<E>extends Iterable<E>:所以的单列集合都可以使用增强for
public interface Iterable<T>实现这个接口允许对象成为"foreach"语句的目标
格式:
for(集合的数据类型 变量名:集合名){
...
}
import java.util.ArrayList;
public class Demo02Foreach {
public static void main(String[] args) {
// 集合的遍历
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("aaa");
arrayList.add("bbb");
arrayList.add("ccc");
for (String str: arrayList) {
System.out.println(str);
}
// 数组的遍历
int[] arr = {1, 2, 3, 4};
for (int i : arr) {
System.out.println(i);
}
}
}
泛型
package cn.sytest.day10.demo03;
import java.util.ArrayList;
import java.util.Iterator;
public class Demo01Generic {
public static void main(String[] args) {
show02();
}
/*
创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2.把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候就会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
*/
private static void show02() {
ArrayList<String> list = new ArrayList<>();
list.add("abc");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
}
}
/*
创建集合对象,不使用泛型
好处:
集合不适用泛型,默认的类型就是Object类型,可以存储任意类型的数据
弊端:
不安全,会引发异常
*/
private static void show01() {
ArrayList list = new ArrayList();
list.add("abc");
list.add(1);
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
// ClassCastException
String s = (String) obj;
System.out.println(s.length());
}
}
}
定义了一个含有泛型的类,模拟ArrayList集合
泛型是一个未知的数据类型,当我们不确定什么数据类型的时候,可以使用泛型
泛型可以接收任意数据的类型,可以使用Integer,String,Student
创建对象的时候确定泛型的数据类型
public class GenericClass<E> {
private E name;
public E getName() {
return name;
}
public void setName(E name) {
this.name = name;
}
}
public class Demo02GenericClass {
public static void main(String[] args) {
GenericClass gc = new GenericClass();
gc.setName("只能说字符串");
Object obj = gc.getName();
// 创建GenericClass对象,泛型使用Integer类型
GenericClass<Integer> gc2 = new GenericClass<>();
gc2.setName(2);
Integer name = gc2.getName();
System.out.println(name);
// 创建GenericClass对象,泛型使用String类型
GenericClass<String> gc3 = new GenericClass<>();
gc3.setName("张三");
String s = gc3.getName();
System.out.println(s);
}
}