浅入浅出Java集合之Collection

笔者思维导图,阐述顺序以此为基准,详细其原理和结构。

一、数据结构的概念

    研究数据的逻辑结构和物理结构以及它们之间的相互关系,并对这种结构定义相应的运算规则,而且确保经过运算后得到的新结构依然是原来的结构类型。

  1. 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合,是计算机操作对象的总称。
  2. 数据元素:构成数据的基本单位,在程序中通常作为一个整体。
  3. 数据项:构成数据元素的基本单位,也是数据结构中的最小单位。
  4. 数据对象:性质相同的数据元素的集合,是数据的一个子集。

    例如:学校作为一台计算机,所有入住的学生、老师、管理人员及其工作人员等 处于数据层次,而数据的基本单位是学生、老师、管理人员和工作人员,数据项则代表学生中学号、姓名、系别等。由此,数据对象可以抽象代表为学生这一类的集合。

二、时间复杂度:

 指执行算法所需要的工作量,即执行每条程序语句的次数乘以执行时间,常用英文大写O符号表述。

场景演示(计算1+...+100的两种方法的时间复杂度):

for (int i=1; i<=n; i++){ 
      sum+=i;//执行n次
}  
for (int i=0; i<=n; i++){ 
     sum+=(1+n)*n/2; // 执行1+n/2次
}  

        即上述例子的函数关系式分别为:f(n)=n、f(n)=1+n/2

        时间复杂度分别为:O(n)、O(n/2)。批注:f(n)=1+n/2随着n渐大,可忽略不计

三、空间复杂度:

  若输入数据所占空间只取决于问题本身,和算法无关,则只需要分析除输入和程序之外的辅助变量所占额外空间。

场景演示(计算数组逆序两种方法的空间复杂度):

for(int i=0,length=array.size();i<length;i++){
       tempArray[i]=array[length-i-1];//空间复杂度为一个 tempArray数组
}
for(int i=0,length=array.size();i<length;i++){
       int temp=array[length-i-1];
       array[lenth-i-1]=array[i];
        array[i]=temp;//空间复杂度为一个整型变量temp
}
四、集合框架的概念:

    一个代表、操作集合的统一架构,包含以下几点:

  • 接口:表示集合的抽象数据类型,允许操作集合时不必关注具体实现,从而达到“多态”,且对实现类具有一定约束规则。
  • 实现类:集合接口的具体实现,是重用性很高的数据结构。
  • 算法:根据需要对实现类中的对象进行计算,比如查找、排序等,重用性高。
五、集合框架的优点:
  •  敏捷编码:集合框架提供了方便的数据结构和算法,无需关心物理结构,直接应用上层业务
  • 高效、健壮、可行:数据结构和算法的性能经过几次升级与迭代,棒棒哒。
  • 稳定:标准的集合框架,顶层定义了基础方法,且基本固定,只需具体实现 ,不但节省学习成本,还不用操心架构设计。
六、集合框架脉络图:

七、Collection集合中的方法:

八、集合的基础操作:
  • int size(): 获取数据元素个数
  • boolean isEmpty():判断集合中是否存在数据元素
  • boolean contains(Object element):判断集合中是否包含指定数据元素
  • boolean add(E element):添加数据元素或者其子类(E表示可接受本身和其子类
  • boolean remove(Object element):删除元素
  • Iterator<E> iterator():获取迭代器
九、操作集合的方法:
  • boolean containsAll(Collection<?> c): 是否包含指定集合 c 的全部元素,集合c是Collection集合的实现类或者子类
  • boolean addAll(Collection<? extends E> c): 追加集合 c 中的全部元素,数据元素可以是本身或者其子类
  • boolean removeAll(Collection<?> c): 删除两集合多个匹配的元素
  • boolean retainAll(Collection<?> c): 保留两集合多个匹配的元素
  • void clear(): 移除全部的数据元素
十、操作数组的方法:
  • Object[] toArray(): 返回全部的数据元素存入Object数组
  • <T> T[] toArray(T[] a): 返回一个包含集合中所有元素的数组,运行时根据数组元素的类型决定返回时数组类型
十一、迭代器:
    迭代器模式: 提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。
List<String> list = new ArrayList<String>();      
for(int i = 0 ; i < list.size() ;  i++){
   String string = list.get(i);//内部访问细节
}
   针对此种方式,由于知道其内部结构,访问代码与集合本身紧密耦合,不同的集合对应不用的遍历方法,使得客户端与集合类代码无法分离,相当麻烦。如此,Iteratort提供同一种逻辑访问集合方式,使得客户端无需知道集合内部结构,从而达到遍历集合的目的。
package java.util;
public interface Iterator<E> {
    boolean hasNext();//判断是否存在下一个对象元素
    E next();//获取下一个元素
    void remove();//移除元素
}
    Iterator遍历过程中移除数据元素的问题:由于在你迭代之前,迭代器已经被通过list.itertor()创建,在后续的迭代过程中,又针对list进行增加、删除等操作,那么Iterator根据其失效机制抛出异常。因为Iterator对象已经无法主动同步list做出的改变,默认为操作是线程不安全的,从而抛出ConcurrentModificationException异常。

猜你喜欢

转载自blog.csdn.net/qq_34289679/article/details/80545340
今日推荐