线性表:零个或多个数据元素的有限序列
线性表是逻辑结构,根据其物理结构的不同分为顺序结构(数组)和链式存储结构(链表)
线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素
手写数组
类结构图
arraylist实现demo
package com.company.datastructure;
public class MyArrayList <E>{
//fields
private Object[] elementData; //底层是数组,用来保存数据
private int size; //存放线性表当前元素个数
private final int DEFAULT_SIZE = 10; //默认数组长度为10
//constructor
public MyArrayList(int initsize){
if(initsize>=0){
elementData = new Object[initsize];
}else{
throw new IllegalArgumentException("初始长度不正确"+ initsize);
}
}
public MyArrayList(){
elementData = new Object[DEFAULT_SIZE]; //没有输入默认构造长度为10的数组
}
//methods
//增加
/**
* 末尾添加元素
* @param element 要添加的添加元素
* @return 添加成功返回true
*/
public boolean add(E element){
ensureCapacity();
elementData[size] = element;
size++;
return true;
}
/**
* 指定位置添加元素
* @param index 索引
* @param element 元素
* @return 添加成功返回true
*/
public boolean add(int index,E element){
rangeCheck(index);
ensureCapacity();
System.arraycopy(elementData,index,elementData,index+1,size-index);
elementData[index] = element;
size++;
return true;
}
//删除
/**
* 删除索引位置处元素
* @param index
* @return 删除元素值
*/
public E remove(int index){
rangeCheck(index);
E oldValue = (E) elementData[index];
System.arraycopy(elementData,index+1,elementData,index,size-index);
size--;
return oldValue;
}
public boolean remove(Object o){
for (int i = 0; i < elementData.length; i++) {
if (o.equals(elementData[i])){
System.arraycopy(elementData,i+1,elementData,i,size-i);
size--;
return true;
}
}
return false;
}
//修改
/**
* 根据索引修改元素值
* @param index 索引
* @param element 新元素值
* @return 旧元素值
*/
public E set(int index,E element){
rangeCheck(index);
E oldValue = (E) elementData[index];
elementData[index] = element;
return oldValue;
}
//查找
/**
* 根据索引获得元素值
* @param index 索引
* @return 元素值
*/
public E get(int index){
rangeCheck(index);
return (E) elementData[index];
}
/*--------------------------------------其他功能----------------------------------------------*/
//数组长度
public int size(){
return size;
}
//是否为空
public boolean isEmpty(){
return size==0?true:false;
}
//toString方法
@Override
public String toString() {
if(size==0){
return "[]";
}else{
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) {
sb.append(elementData[i]+",");
}
int len = sb.length();
return sb.delete(len-1,len).append("]").toString();
}
}
/*------------------------------------------------------------------------------------*/
/**
* 数组扩容
*/
private void ensureCapacity(){
if(elementData.length-1>=size){
Object[] newArray = new Object[elementData.length+(elementData.length>>1)]; //右移一位相当于除以2
System.arraycopy(elementData,0,newArray,0,elementData.length); //数组拷贝
elementData = newArray;
}
}
/**
* 索引检查
* @param index 索引
*/
private void rangeCheck(int index){
if(index<0||index>=size){
throw new IndexOutOfBoundsException("索引不合法"+index);
}
}
}
测试demo
package com.company.datastructure;
public class TestMyArrayList {
public static void main(String[] args) {
MyArrayList<String> mal = new MyArrayList<>();
for (int i = 0; i < 20; i++) {
mal.add("chen"+i);
}
System.out.println(mal);
mal.add(10,"陈");
mal.remove(20);
mal.remove("chen0");
System.out.println(mal);
mal.set(0,"这是0");
System.out.println(mal.get(0));
System.out.println(mal.size()+" "+mal.isEmpty());
}
}