Web全栈~22.数据结构(线性表)
上一期
前言
数据结构系列的博客,我过去也有写过,但那都是基于C语言。接下来几期关于数据结构的博客则会使用Java来实现。数据结构的逻辑概念就不重复说了,这里提供以前写过的博客链接。
顺序表采用一组地址连续的存储单元依次存放数据元素,通过元素之间的先后顺序来确定元素 之间的位置,因此存储空间的利用率较高
单链表采用一组地址任意的存储单元来存放数据元素,通过存储下一个节点的地址值来确定节 点之间的位置,因此存储空间的利用率较低。
存储方式比较
顺序表查找的时间复杂度为 O(1),插入和删除需要移动元素,因此时间复杂度为 O(n)。若是需 要频繁的执行查找操作,但是很少进行插入和删除操作,那么建议使用顺序表。
单链表查找的时间复杂度为 O(n),插入和删除无需移动元素,因此时间复杂度为 O(1)。若是需 要频繁的执行插入和删除操作,但是很少进行查找操作,那么建议使用链表。
相关博客
ArrayList
关于线性表的基本概念,上面已经提供了链接。我们知道线性表的存储结构有顺序存储结构和链式存储结构,顺序存储结构被称为顺序表。链式存储结构被称为链表。
而ArrayList则就是一种类似顺序表的数据结构。
ArrayList底层是使用数组作为容器存储数据,不同于数组的是,ArrayList的内存长度是动态变化的,而数组的长度一旦确定好了之后就无法再改变。因此,存储不确定大小数据的时候,使用ArrayList比使用数组会更加方便。
ArrayList接口
package arraylist.List;
import arraylist.iterator.Iterator;
public interface List <T>{
// ------- 添加 -------
void add(Object object);
// ------- 根据坐标删除 -------
void remove(int index);
// ------- 根据内容删除 -------
void removeobj(Object object);
// ------- 取出数据 -------
Object get(int index);
// ------- 求集合的长度 -------
int size();
// ------- 判断集合是否为空 -------
boolean isEmpty();
// ------- 根据内容找到元素坐标 -------
int IndexOf(Object object);
// ------- 判断元素是否存在 -------
boolean contions(Object object);
// ------- 根据坐标位置插入元素 -------
void add(int index, Object object);
// ------- 修改元素 -------
void replase(int index, Object object);
// ------- toString -------
String toString();
// ------- arraylist迭代器 -------
Iterator iterator();
}
Iterator接口
public interface Iterator <T>{
boolean hasNext();
T next();
}
ArrayList实现类
public class ArrayList <T>implements List {
public Object []elementData; //数组的引用
private int size; //集合的大小,并非elementData.length
//如果用户没设置大小就初始为10
public ArrayList(){
this(10); //数组大小初始为10
}
//集合的大小等于用户设置的大小
public ArrayList(int len){
elementData = new Object[len];
}
// 数组的扩容
void grow(){
//创建新的数组
Object []newArr = new Object[elementData.length + (elementData.length >> 1)];//扩容1.5倍
for(int i = 0; i < size; i++){
//将原来数组的内容存到新数组里
newArr[i] = elementData[i];
}
elementData = newArr;
}
//在集合的尾部添加元素
public void add(Object object) {
//如果数组长度不够就调用扩容
if(elementData.length <= size){
grow();
}
elementData[size] = object;
//大小增加一位
size++;
}
//根据坐标删除元素
public void remove(int index) {
//判断用户是否输入错误
if(index<0|| index >size-1){
throw new IndexOutOfBoundsException("索引越界"+index);
}
Object element=elementData[index];
// 向前移动元素
for (int i = index; i <size-1 ; i++) {
elementData[i]=elementData[i+1];
}
// 最后一个元素置为空
elementData[size-1]=null;
size--;
}
//根据元素删除
public void removeobj(Object object) {
int index = IndexOf(object);
//判断用户是否输入错误!
if(index<0){
throw new NullPointerException();
}
remove(index);
}
//根据坐标得到元素
public Object get(int index) {
return elementData[index];
}
//求集合的长度
public int size() {
return size;
}
//判断是否为空
public boolean isEmpty() {
return size == 0;
}
//根据元素找到坐标
public int IndexOf(Object object) {
int i = 0;
while(i < size){
if(elementData[i].