今日内容
-
Collection集合
-
迭代器
-
增强for循环
-
泛型
Collection集合
集合:集合就是一种存储数据的容器,之前的ArrayList集合
1.集合和数组的区别
1.数组长度固定。 集合是长度可变的
2.数组只能存储同一种数据类型,包括基本数据类型和引用数据类型(对象数组)。集合存储的都是对象,而且可以在同一集合中存储不同类型的数据。
2.集合的分类
在使用API的时候,先了解其继承与接口的框架,才能了解何时使用哪个类
集合可以根据存储结构将其分为两大类:单列集合:java.util.List。和双列集合:java.util.Set。其中,
Collection接口有三个实现类:Vector集合,ArrayList集合,LinkedList集合
Set接口也有三个实现类:TreeSet集合,HashSet集合,LinkedHashSet集合,
3.其子接口的特点
Collection是单列集合的根接口,
List子接口集合的特点是:元素有序,元素可重复,有索引。其子类有上述三种
Set接口集合特点是:元素不重复,没有索引。其子类也是上述三种。
4.Collection集合的常用功能【重点】
public boolean add(E e):把给定的对象添加到当前的集合中 public void clear():清空集合当中的所有元素。(此删除只是集合中删除,但是内存中还存在) public boolean remove(E e):把给定的对象从当前集合中删除掉 public boolean contains(E e):判断当前集合当中是否包含给定的对象元素 public boolean isEmpty(): 判断当前集合是否为空 public int size(): 获取当前集合元素的个数 public Object[] toArray(): 把当前集合中的元素存储到一个数组当中
迭代器(Iterator)接口
迭代器:java.util.Iterator接口。用于迭代访问Collection和Map接口中的元素。因此,将Iterator称为迭代器。
1.格式:
public Iterator iterator(): 获取集合对应的迭代器,用来遍历集合当中的元素。
2.迭代的概念
迭代:Collection集合元素的通用获取方式。
3.常用API方法:
public E next():获取迭代的下一个元素 public boolean hasNext():如果集合当中仍有元素可以迭代,则返回true,如果没有,则返回false
4.迭代器的实现原理
调用Iterator接口当中的next方法之前,迭代器的索引位于-1,不指向任何元素,
当第一次调用next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,
当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,以此类推,直到hasNext方法返回false时,表示迭代器达到了集合的末尾,终止对元素的遍历,
如果强硬的获取没有的元素,此时程序就会抛出java.util.NoSuchElementException
Iterator<E>接口也是有泛型的,迭代的泛型是跟着集合一样,集合定义什么类型,迭代器就是什么类型。
增强for循环
JDK1.5之后的高级循环结构:for each 循环,只能用来遍历数组和集合。内部原理是有个迭代器Iterator,在迭代过程中,不能对集合当中的元素进行增删操作。
1.格式
for(元素的数据类型 变量名 : Collection集合或者数组的名){ //操作代码 //.... }
练习:(遍历数组)
int[] arr={3,5,7,9,12}; for(int a : arr){ System.out.println(a); }
(遍历集合)
Collection <String> coll =new ArrayList<>(); coll.add("姚明"); coll.add("科比"); ... ... for(String str : coll){ System.out.println(str);//str 表示集合中的每个元素 }
泛型
预支类或者方法中的未知数据类型。是一个数据类型,可以看做是一个接受数据类型的变量。
泛型也是数据类型的一部分,一般我们将类名和泛型合并一起看作数据类型。
泛型的好处:
1.避免了类型转换的麻烦,存入什么数据类型,取出就是什么数据类型
2.运行期异常(跑起来的异常)提升到编译期阶段(写代码的时候就会报错)
类名使用泛型
修饰符 class 类名<代表泛型的变量>{ }
方法定义泛型(方法定义类可以不用定义)
修饰符<代表泛型的变量> 返回值类型 方法名(参数列表){
}
接口定义泛型和使用
修饰符 interface 接口名<代表泛型的变量>{ }
使用:
1.定义实现类的时候,可以确认泛型的类型
public class 实现类名 implements 父接口 <String >{ @Override public void add(String e){ //... } }
2.始终不确定泛型的类型,直到创建对象时
public class 子实现类名 implement 父接口名<泛型>{ @Override public void add(T t){ //... } }