最近发现了自己一个很严重的问题,在需要写一个集合的时候总是想也不想就去用ArrayList,需要用键值对的时候马上就想到了HashMap。(不要说我渣,我相信这样的程序员不在少数!)
这是一个非常不好的习惯,或者说,是一个无知者的习惯,一般情况下是不会出啥问题的,不过···是一般情况下。自从上次掉坑以后我深刻反思了一下自己。(什么坑我就不说了,反正很坑!)
当时学基础的时候这些集合都学过,相关的资料也看过不少,为啥到最后只脑子里只剩下HashMap,ArrayList 。还是因为自己没有搞懂他们内部是如何运作的,他们之间的区别以及他们的特性!
想要彻底搞定源码,数据结构的知识必不可少,因此小渣整理了一下线性表的知识。(引用某不知名CEO的一句话,掌握数据结构是从代码搬运工转向IT工程师的重要一步!)
以下仅代表个人观点,如有错误欢迎指正!
线性表
定义:由n(n≥0)个相同类型的数据元素(结点)组成的有限序列。
特点:
有一定顺序
数据个数是有限的
对于整个表,只有一个开始结点(它的前面无记录)和一个终端结点(它的后面无记录),其他结点有且只有一个直接前趋和直接后继。
基本操作
public interface IIinarList<T> {
void insertNode(T a,int i);//向指定位置插入元素
void deleteNode(int i);//删除指定位置元素
T searchNode(int i);//查找指定元素
int getLength();//求表长度
void clear();//清空操作
boolean isEmpty();//判断线性表是否为空
}
线性表有两种实现方式,即顺序存储(顺序表)和链式存储(链表)
顺序表
定义:把线性表的结点按逻辑顺序一次存放在一组地址连续的存储单元中。
特点
地址连续。
想到连续地址,我们首先想到的肯定是数组了。
为了直观体现,这里我们使用数组实现。
ps:已经很努力简化代码了,可以先略过不看,到最后分析的时候再回来。
public class SeqList<T> implements ILinarList<T> {
private int maxSize; //当前顺序表最大容量
private Object[] data; //存放数据的数组
private int length; //当前表长度
public int getMaxSize() {
return maxSize;
}
public void setMaxSize(int maxSize) {
this.maxSize = maxSize;
}
public Object[] getData() {
return data;
}
public void setData(Object[] data) {
this.data = data;
}
public void setLength(int length) {
this.length = length;
}
//指定长度初始化线性表