前面我们学习ArrayList集合的时候已经大致介绍过一些集合的知识了,下面咱再继续介绍一种集合,Collection集合。
在介绍ArrayList集合的时候,咱说java中的集合有三种,分别是List、Map、Set。咦,没有Collection集合呀。别着急,其实List和Set集合就是Collection集合,为什么我会这么说呢,来看看下面的关系图:
咱们之前学过的ArrayList集合只是集合中的一个,也是最简单的一个,本篇文章咱会先介绍Collection集合,以及介绍一些关于其他集合需要学习的知识,比如:迭代器、什么是泛型以及数据结构的介绍。
一、Collection集合的功能
public boolean add(E e):把给定的对象添加到当前集合中 。
public void clear():清空集合中所有的元素。
public boolean remove(E e):把给定的对象在当前集合中删除。
public boolean contains(Object obj):判断当前集合中是否包含给定的对象。
public boolean isEmpty():判断当前集合是否为空。 如果为空返回true
public int size():返回集合中元素的个数。
public Object[] toArray():把集合中的元素,存储到数组中
代码演示:
对于Collection集合咱就只需要了解他的这些功能就好,其他的基本不用,主要还是用它的那些子类集合,咱后面慢慢学。
二、Iterator迭代器
1.概述
直接来看在API中的介绍;
Iterator是在程序开发中,由于经常需要遍历集合中的所有元素,所以针对这种需求,JDK专门提供的一个接口。想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:
Iteratoriterator() 返回在此 collection 的元素上进行迭代的迭代器
注意:使用集合类的对象调用上述方法就可以获取迭代器对象了。
2.Iterator接口的常用方法:
方法 | 说明 |
E next() | 获取集合中的元素 |
boolean hasNext() | 判断集合中有没有下一个元素,如果仍有元素可以迭代,则返回 true。 |
void remove() | 删除当前元素 |
代码演示:
3.迭代器原理:
事先声明,由于这个原理我也没搞懂,所以是在其他网站上找的一些资源,如有问题,请大家给我说一下,我会修改。
以下为正文:
当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。
Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素。在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
原理图:
4.增强for循环
这是jdk5以后诞生的技术,原理同样是基于Iterator迭代器。作用是简化迭代器使用的。
代码演示:
三、泛型
1.概述
咱前面介绍过,集合中可以存储任意类型的对象,些对象一旦保存到集合中之后,都会被提升成Object类型。当我们取出这些数据的时候,取出来的时候一定也是以Object类型给我们,所以取出的数据发生多态了。发生多态了,当我们要使用保存的对象的特有方法或者属性时,需要向下转型。而向下转型有风险,我们还得使用 instanceof关键字进行判断,如果是想要的数据类型才能够转换,不是不能强制类型转换,使用起来相对来说比较麻烦,还有出错的风险。
上面这些乱七八糟的是网上找的,为了凸显我文章的高大尚,我会在里面加一些百度百科里面对这些知识的概述,事实上还是我理解的不过透彻,表述不出来啦。
我对泛型的理解呢很简单,就是在集合中给想要储存的数据给个限定,你规定它是什么什么类型,那就只能在集合中添加什么类型的数据。其实只知道这个就可以了。
2.优点
优点就是咱刚才说的,给往集合中添加的数据给个限定,只能储存一类数据,不然储存多种类型的数据很容易造成编译错误,同样也避免了强制抓换数据类型的麻烦。
3.注意事项
①泛型只支持引用数据类型(类类型或接口类型等),泛型不支持基本数据类型(int、double...)
②泛型不支持数据类型以继承的形式存在,要求前后泛型的数据类型必须一致
这就得先知道泛型的格式了,
③就是对上面问题的解决,就是在jdk1.7之后,咱们定义泛型的时候可以只在前面写,后面之加尖括号,可以不写内容。那样也不会报错。
4.自定义泛型
我们之前对于泛型都是在使用别人定义好的,我们使用。就是在集合中。我们也可以自己定义泛型。自定义泛型有三种:自定义泛型类、自定义泛型方法、自定义泛型接口。
(1)自定义泛型类
泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。
泛型类基本写法:
代码演示:
(2)自定义泛型方法;
自定义泛型方法是在调用方法时确定泛型
格式:
代码演示:
(3)自定义泛型接口;
格式:
接口的泛型确定具体的数据类型由两种方式:
1.是实现类实现接口时确定
public class InterImpl implements Inter{}
2.泛型的传递
public interface Inter{}
public class InterImplimplements Inter{}
InterImpl ip = new InterImpl<>();//创建对象时确定自定义泛型类的数据类型
补充:集合使用的就是泛型传递的方式确定泛型的具体数据类型
public interface Collection{}
public interface Listextends Collection{}
public class ArrayListimplements List{}
ArrayList list = new ArrayList();
代码演示:
(3) 泛型通配符和限定
泛型通配符符号是:使用问号?表示泛型通配符。
类型通配符:
ArrayList: 表示元素类型未知的ArrayList,它的元素可以匹配任何的类型但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型
泛型通配符的使用:
泛型限定
上限限定:? extends E 这里的?可以是E类型本身以及子类类型
ArrayListList : 它表示的类型是Number或者其子类型
代码演示:
下限限定:? super E 那么通配符?的数据类型可以是E本身以及父类
ArrayListList : 它表示的类型是Number或者其父类型
代码演示: