ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

集合框架(一):Collection、List接口与AbstractCollection、AbstractList抽象类

2021-06-04 20:30:15  阅读:166  来源: 互联网

标签:迭代 AbstractCollection List 指定 接口 Collection 集合 方法


Collection接口

Java的集合框架总体分为两种

  • 一个个数据的存储
  • 一对对数据的存储

一个个数据的存储对应的是Collection接口,而Collection接口主要的集合子接口有List接口和Set接口
在这里插入图片描述
可以看到Collections里面的方法,有很多泛型方法,所以Collection接口是面向泛型来设计的
在这里插入图片描述
而且Collection接口继承了迭代器
在这里插入图片描述
也就是有迭代方式可以去遍历

List接口

List接口是继承了Collection接口的,所以拥有Collection接口的所有方法
在这里插入图片描述
在Collection接口的基础上,自己又额外增加了一些方法,因为List是有序可重复型的,所以是可以根据索引去获取数据的,而Collection并没有这方面的支持,所以List需要扩展这类支持
在这里插入图片描述
而List主要有几个实现类需要注意,分别为如下

  • AbstractList
  • ArrayList
  • LinkedList
    在这里插入图片描述

AbstractCollection

AbstractCollection是Collection接口的一个抽象实现类,他的作用就是给一些Collection接口方法加上默认实现
在这里插入图片描述
有默认实现的方法如下

  1. isEmpty :集合是否为空
    在这里插入图片描述

  2. contains:集合是否包含指定Object对象

    使用迭代器去实现,如果指定对象为NULL,迭代找到NULL,如果找到就返回True,如果指定对象不为NULL,迭代使用equals方法进行比对(所以使用集合最好要重写equals方法,还要重写hashCode方法)
    在这里插入图片描述

  3. toArray:集合转换成数组

    可以看到,这里先创建一个返回的Object数组,默认容量为集合的size,然后使用for去遍历要返回的数组,然后使用迭代器遍历集合里面的元素,这里迭代器遍历和for是同步的,也就是for一次,迭代器也一次,如果集合里面的元素数量少于Object数组(也就是迭代器提前没有下一个可获取的元素了,那么就不需要那么大的Object数组了),那么就会使用Arrays.copyof生成一个新的数组去返回(新的数组把旧的Object数组的元素复制进来),假如for循环提前结束了,但迭代器还能继续获取值,那么就调用finishToArray方法,如果没有就返回Object数组
    在这里插入图片描述
    看一下finishToArray的方法实现
    在这里插入图片描述
    使用变量i来标记当前元素数量,再对迭代器剩下的元素进行迭代,使用cap来代表当前数组容量,假如当前元素数量大于数组容量,那么就要进行扩容,扩容的规则为1.5倍加1,然后还要去判断是否超过了MAX_ARRAY_SIZE(MAX_ARRAY_SIZE为Integer的最大值减去8)
    在这里插入图片描述
    如果超过了,就会调用hugeCapacity,根据当前数组需要的容量去获取可以得到最大的容量
    在这里插入图片描述
    如果需要的容量大于MAX_ARRAY_SIZE,就返回Integer的最大值,如果不大于就返回MAX_ARRAY_SIZE(比Integer最大值小8)

    这样做的原因可能是,这次扩容超过了MAX_ARRAY_SIZE,但不允许超过这个,所以就根据当前实际情况再去分配,最大只能拿到Integer最大值的空间

  4. add

    该方法直接抛出一个异常,所以这个方法必须被重写,否则是调用不了的
    在这里插入图片描述

  5. remove

    该方法删除集合中的指定元素,使用迭代器去寻找,寻找之后,迭代器进行删除
    在这里插入图片描述

  6. containsAll:判断指定集合是否都在该集合中,通过增强for遍历指定集合,调用contains方法,时间复杂度为 O ( N 2 ) O(N^2) O(N2)

    在这里插入图片描述

  7. addAll:将指定集合增加到该集合中去,也是通过迭代器去遍历指定集合,然后逐个调用add方法
    在这里插入图片描述

  8. removeAll:该集合去删除指定集合中的值,如果集合中包含该集合的元素,该元素就会被删除,通过迭代器去遍历自己,然后让指定集合调用contains方法,看当前集合的这个元素是否存在于指定集合里面,如果存在就迭代器进行删除,也就是判断指定集合有没有我这个元素,如果有,就进行删除
    在这里插入图片描述

  9. retainAll:与removeAll功能相反,该集合保留指定集合的值,通过迭代器遍历自己,然后让指定结合调用contains方法,看当前集合的这个元素是否存在于指定集合里面,如果不存在就删除,存在才保留
    在这里插入图片描述

  10. clear:删除集合里面的所有值,使用迭代器去遍历自己,然后逐个remove
    在这里插入图片描述

  11. toString:将集合转化成字符串
    在这里插入图片描述

AbstractList

AbstractList即继承了上面提到的AbstractCollection,还实现了List接口,也就是AbstractList在拥有基本Collection接口的默认实现方法(AbstractCollection),还拓展了List接口方法的支持,增加了List接口一些方法的默认实现(List接口虽然也继承了Collection接口,但没有去默认实现Collection的一些方法)
在这里插入图片描述
在这里插入图片描述
接下来看看他实现了什么方法

  1. add:前面已经知道AbstractCollection方法对于add方法是直接抛出一个异常,所以必须要进行重写才可以调用,AbstractList就重写了add方法
    在这里插入图片描述
    然后其调用了List接口的add(int size,E element)方法和AbstractCollection的size()方法,对于这个方法应该是交由具体的实现子类(也就是延迟到了子类去实现,对应于模板方法设计模式
    在这里插入图片描述
  2. set方法:该方法是替换集合中指定位置的元素为指定元素,也是默认直接抛出异常,必须让子类重写才可以具体调用
    在这里插入图片描述
  3. remove方法:删除集合指定位置的元素,也是默认抛出异常
    在这里插入图片描述
  4. indexof方法:该方法是返回指定元素在集合中的位置(从前往后数),也是对指定值是否为NULL分为了两种情况去进行,使用==来判断是否为NULL,使用迭代器去遍历集合去对比,然后返回迭代器的previousIndex,如果找不到就返回-1
    在这里插入图片描述
  5. lastIndexof:该方法也是返回指定元素在集合中的位置,只不过是从后面开始数
    在这里插入图片描述
  6. 还有很多就不一一讲解了,翻源码看吧

标签:迭代,AbstractCollection,List,指定,接口,Collection,集合,方法
来源: https://blog.csdn.net/GDUT_Trim/article/details/117572245

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有