传递集合对象_java学习笔记:【Collection集合】及【泛型】知识介绍

  前面我们学习ArrayList集合的时候已经大致介绍过一些集合的知识了,下面咱再继续介绍一种集合,Collection集合。

   在介绍ArrayList集合的时候,咱说java中的集合有三种,分别是List、Map、Set。咦,没有Collection集合呀。别着急,其实List和Set集合就是Collection集合,为什么我会这么说呢,来看看下面的关系图:

7d5f670316b3f573d83812bca3dfc1e1.png

   咱们之前学过的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():把集合中的元素,存储到数组中

代码演示:

7c10a4ce5f354236c5d2fcb9840fd33f.png

   对于Collection集合咱就只需要了解他的这些功能就好,其他的基本不用,主要还是用它的那些子类集合,咱后面慢慢学。

二、Iterator迭代器

1.概述

   直接来看在API中的介绍;

5cac4c60dbf1b16e71dc3ab63c8c6ab5.png

   Iterator是在程序开发中,由于经常需要遍历集合中的所有元素,所以针对这种需求,JDK专门提供的一个接口。想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作,下面介绍一下获取迭代器的方法:

   Iteratoriterator() 返回在此 collection 的元素上进行迭代的迭代器

   注意:使用集合类的对象调用上述方法就可以获取迭代器对象了。

2.Iterator接口的常用方法:

方法

说明

E next()

获取集合中的元素

boolean hasNext()

判断集合中有没有下一个元素,如果仍有元素可以迭代,则返回 true。

void remove()

删除当前元素

   代码演示:

4af58804238635487e8c7864be64a80b.png

3.迭代器原理:

   事先声明,由于这个原理我也没搞懂,所以是在其他网站上找的一些资源,如有问题,请大家给我说一下,我会修改。

   以下为正文:

   当遍历集合时,首先通过调用集合的iterator()方法获得迭代器对象,然后使用hashNext()方法判断集合中是否存在下一个元素,如果存在,则调用next()方法将元素取出,否则说明已到达了集合末尾,停止遍历元素。

   Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素。在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。

   原理图:

fb1dfc56ef78c457ec4b5ae7babecb27.png

c25e63fb0f3f40705cfc6f68259b62f6.png

4.增强for循环

   这是jdk5以后诞生的技术,原理同样是基于Iterator迭代器。作用是简化迭代器使用的。

   代码演示:

f7b0c6aee4f3b5af7a075a56ba1e7a6c.png

三、泛型

1.概述

   咱前面介绍过,集合中可以存储任意类型的对象,些对象一旦保存到集合中之后,都会被提升成Object类型。当我们取出这些数据的时候,取出来的时候一定也是以Object类型给我们,所以取出的数据发生多态了。发生多态了,当我们要使用保存的对象的特有方法或者属性时,需要向下转型。而向下转型有风险,我们还得使用 instanceof关键字进行判断,如果是想要的数据类型才能够转换,不是不能强制类型转换,使用起来相对来说比较麻烦,还有出错的风险。

   上面这些乱七八糟的是网上找的,为了凸显我文章的高大尚,我会在里面加一些百度百科里面对这些知识的概述,事实上还是我理解的不过透彻,表述不出来啦。

   我对泛型的理解呢很简单,就是在集合中给想要储存的数据给个限定,你规定它是什么什么类型,那就只能在集合中添加什么类型的数据。其实只知道这个就可以了。

2.优点

   优点就是咱刚才说的,给往集合中添加的数据给个限定,只能储存一类数据,不然储存多种类型的数据很容易造成编译错误,同样也避免了强制抓换数据类型的麻烦。

3.注意事项

   ①泛型只支持引用数据类型(类类型或接口类型等),泛型不支持基本数据类型(int、double...)

   ②泛型不支持数据类型以继承的形式存在,要求前后泛型的数据类型必须一致

   这就得先知道泛型的格式了,

fa170c0d26e4a3021a3010721279b0f2.png

   ③就是对上面问题的解决,就是在jdk1.7之后,咱们定义泛型的时候可以只在前面写,后面之加尖括号,可以不写内容。那样也不会报错。

4.自定义泛型

   我们之前对于泛型都是在使用别人定义好的,我们使用。就是在集合中。我们也可以自己定义泛型。自定义泛型有三种:自定义泛型类、自定义泛型方法、自定义泛型接口。

   (1)自定义泛型类

   泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。最典型的就是各种容器类,如:List、Set、Map。

   泛型类基本写法:

6fb6dd54788616231e61fcc1f07a169c.png

   代码演示:

8614118b7cc8cc3752e059a0a9e47598.png

   (2)自定义泛型方法;

   自定义泛型方法是在调用方法时确定泛型

   格式:

8deca5ab7d97066f8cc8ab160a525190.png

   代码演示:

f8fedd4765fe83d899eddd986e859ea8.png

   (3)自定义泛型接口;

   格式:

40796e1cba490d4d137070c224cc7fc2.png

   接口的泛型确定具体的数据类型由两种方式:

    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();

   代码演示:

40aada50d8cfaa17632521e19ceaa41c.png

   (3) 泛型通配符和限定

   泛型通配符符号是:使用问号?表示泛型通配符。

   类型通配符:

      ArrayList: 表示元素类型未知的ArrayList,它的元素可以匹配任何的类型但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型

   泛型通配符的使用:

d9669fe63adf0fe79cc66f05e1501775.png

   泛型限定

   上限限定:? extends E 这里的?可以是E类型本身以及子类类型

      ArrayListList : 它表示的类型是Number或者其子类型

   代码演示:

d3f17cddc9f73efc7d73cbc92bef6d0c.png

   下限限定:? super E 那么通配符?的数据类型可以是E本身以及父类

      ArrayListList : 它表示的类型是Number或者其父类型

   代码演示:

4c4e8e42ce760be9c1fc4b8f98cfa7c4.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值