a.定义的是所有 单列集合 中共性的方法
b.所有的单列集合都可以使用共性的方法
c.没有带索引的方法(因为 Set
集合没有索引)
a. 学习顶层 :学习顶层接口/抽象类中共性的方法
b. 使用底层 :顶层无法实例化,通过使用底层熟悉规则
1. public boolean add(E e)
2. public void clear()
3. public boolean remove(E e)
4. public boolean contains(E e)
5. public boolean isEmpty()
6. public int size()
7. public object[] toArray
a. 有序 (存储和取出元素顺序相同) b. 允许存储 重复的元素
c. 有索引
,可以使用普通的 for
循环遍历
a. 不允许 存储重复元素
b. 无索引
(不能使用普通的 for
循环遍历)
Iterator
迭代器,即 Collection
集合元素的通用获取方式
在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来,一直把集合中的所有元素全部取出。这种取出方式专业术语称为 迭代
boolean hasNext() E next()
Iterator迭代器,是一个接口,无法直接使用,需要使用Iterator接口的实现类对象,获取实现类的方式比较特殊
Collection
接口有一个方法,为 iterator()
,这个方法返回的就是迭代器实现类的对象 Iterator<E>
(其中的泛型E根据集合中的数据类型而定), iterator()
返回在此 Collection
的元素上进行迭代的 迭代器
/* 1. 使用集合中的方法iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态) 2. 使用Iterator接口中的方法hasNext()判断还有没有下一个元素(最开始,指针指向-1位置) 3. 使用Iterator接口中的方法next()取出集合中的下一个元素(同时会将指针向后移动一位) */ 复制代码
foreach()
语句)
增强for循环:底层使用的也是 迭代器
,使用 for
循环的格式,简化了迭代器的书写
Collection<E> extends Iterator<E>
:
所有的单列集合都可以使用增强 for
循环
, public interface Iterator<T>
实现这个接口允许对象成为 foreach
语句的目标( T->Type
, E->Element
)
用来遍历 集合 和 数组
for(集合/数组的数据类型 变量名:集合名/数组名){ sout(变量名); } 复制代码
可以存储多种类型数据
//可以实现,但风险更大,因此多使用泛型 ArrayList list = new ArrayList(); list.add("abc"); list.add(11); 复制代码
泛型定义在类名后,用 <>
标识
创建对象的时候确定泛型的数据类型,如果创建时不标明,则默认为是Object类型
public class GenericClass<E>{ private E name; ... } 复制代码
泛型定义在方法的修饰符和返回值类型之间
调用方法时确定泛型类型即可
public <M> void method(M m){ System.out.println(m); } 复制代码
泛型定义在接口之后,用 <>
标识
a. 可以在实现类中确定类型 b. 也可以在创建实现类对象时确定类型(参考ArrayList<>)
public class GenericInterfaceImpl implements GenericInterface<String>{ @Override public void method(String s){ System.out.prinln(s); } } 复制代码
public class GenericInterfaceImpl<I> implements GenericInterface<I>{ @Override public void method(I i){ System.out.println(i); } } 复制代码
? : 代表任意的数据类型
不能创建对象使用,只能作为方法的参数使用,定义存储时都不能使用
public class DemoGeneric{ public static void main String(String[] args){ ArrayList<Integer> list1 = new Arraylist<>(); list1.add(1); list1.add(2); Arraylist<String> list2 = new Arraylist<>(); list2.add("a"); list2.add("b"); } /* 定义一个方法,可以遍历所有类型的ArrayList集合 不能用Object类似多态一样,因为泛型没有继承概念 */ public static void printArray(ArrayList<?> list){ Iterator<?> it = list.iterator(); while(it.hasNext()){ Object o = it.next();(多态) System.out.println(o);//直接打印o.toString()输出了子类o的内容 } } 复制代码
泛型的上限限定: ? extends E:
代表使用的泛型只能是E类型的子类/本身
泛型的下限限定:? super E :
代表使用的泛型只能是E类型的父类/本身