笔者思维导图,阐述顺序以此为基准,详细其原理和结构。
一、数据结构的概念
研究数据的逻辑结构和物理结构以及它们之间的相互关系,并对这种结构定义相应的运算规则,而且确保经过运算后得到的新结构依然是原来的结构类型。
- 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合,是计算机操作对象的总称。
- 数据元素:构成数据的基本单位,在程序中通常作为一个整体。
- 数据项:构成数据元素的基本单位,也是数据结构中的最小单位。
- 数据对象:性质相同的数据元素的集合,是数据的一个子集。
例如:学校作为一台计算机,所有入住的学生、老师、管理人员及其工作人员等 处于数据层次,而数据的基本单位是学生、老师、管理人员和工作人员,数据项则代表学生中学号、姓名、系别等。由此,数据对象可以抽象代表为学生这一类的集合。
二、时间复杂度:
指执行算法所需要的工作量,即执行每条程序语句的次数乘以执行时间,常用英文大写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异常。