线性表之顺序存储结构
顺序存储结构:
把逻辑上相邻的节点存储在物理上相邻的存储单元上。
优点:
节省存储空间,因为分配给数据的存储单元完全用于存放节点的数据,节点之间的逻辑关系没有占用额为的存储空间。
缺点:
插入和删除操作需要移动元素,效率较低。
自己实现ArrayList集合
List.java
/**
* 线性表接口
* 和存储结构无关
* @author Administrator
*
*/
public interface List {
// 返回线性表的大小,即数据元素的个数。
public int size();
// 返回线性表中序号为 i 的数据元素
public Object get(int i);
// 如果线性表为空返回 true,否则返回 false。
public boolean isEmpty();
// 判断线性表是否包含数据元素 e
public boolean contains(Object e);
// 返回数据元素 e 在线性表中的序号
public int indexOf(Object e);
// 将数据元素 e 插入到线性表中 i 号位置
public void add(int i, Object e);
// 将数据元素 e 插入到线性表末尾
public void add(Object e);
// 将数据元素 e 插入到元素 obj 之前
public boolean addBefore(Object obj, Object e);
// 将数据元素 e 插入到元素 obj 之后
public boolean addAfter(Object obj, Object e);
// 删除线性表中序号为 i 的元素,并返回之
public Object remove(int i);
// 删除线性表中第一个与 e 相同的元素
public boolean remove(Object e);
// 替换线性表中序号为 i 的数据元素为 e,返回原数据元素
public Object replace(int i, Object e);
}
ArrayList.java(主要看add函数的实现)
/**
* 顺序表
* 底层采用的数组,但是长度可以动态变化
*
* java.util.ArrayList 每次增长50%
* @author Administrator
*
*/
public class ArrayList implements List {
private Object[] elementData; //底层是一个数组,目前还没有确定长度
private int size; //不是数组分配了几个空间,而是元素的个数
public ArrayList() {
//没有指定长度,默认长度是4
this(4);
//没有指定长度,长度是0
//elementData = new Object[]{};
}
/**
*
* @param initialCapacity 指定数组的初始长度
*/
public ArrayList(int initialCapacity) {
//给数组分配指定数量的空间
elementData = new Object[initialCapacity];
//指定顺序表的元素个数,默认是0
//size=0;
}
@Override
public int size() {
return size;
}
@Override
public Object get(int i) {
if(i<0 || i>=size){//i<0 或者 i>=size
//throw new RuntimeException("数组索引越界异常:"+i);
throw new MyArrayIndexOutOfBoundsException("数组索引越界异常:"+i);
}
return elementData[i];
}
@Override
public boolean isEmpty() {
return size ==0;
}
@Override
public boolean contains(Object e) {
// TODO Auto-generated method stub
return false;
}
@Override
public int indexOf(Object e) {
return 0;
}
@Override
public void add(int i, Object e) {
//i的位置要正确
if(i<0 || i>size){
throw new MyArrayIndexOutOfBoundsException("数组索引越界异常:"+i);
}
//数组满了,就扩容
if(size == elementData.length){
grow();
}
//后移i及其后面元素,从最后一个元素开始
for(int j=size ;j>i; j--){
elementData[j] = elementData[j-1];
}
//给数组第i个位置赋值
elementData[i] = e;
//元素个数+1
size++;
//elementData[size++] = e;
//System.out.println("length="+elementData.length);
}
@Override
public void add(Object e) {
this.add(size, e);
// //数组满了,就扩容
// if(size == elementData.length){
// grow();
// }
//
// //给数组赋值
// elementData[size] = e;
// //元素个数+1
// size++;
// //elementData[size++] = e;
// //System.out.println("length="+elementData.length);
}
private void grow(){
// //新创建一个新的数组,长度是旧数组2倍
// Object [] newArr = new Object[elementData.length*2];
// //将旧数组的数据拷贝到新数组
// for(int i=0;i<size;i++){
// newArr[i] = elementData[i];
// }
// //让elementData指向新数组
// elementData = newArr;
elementData = Arrays.copyOf(elementData, elementData.length*2);
}
@Override
public boolean addBefore(Object obj, Object e) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean addAfter(Object obj, Object e) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object remove(int i) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean remove(Object e) {
// TODO Auto-generated method stub
return false;
}
@Override
public Object replace(int i, Object e) {
// TODO Auto-generated method stub
return null;
}
//[123,321,456,666,678.....]
@Override
public String toString() {
if(size == 0){
return "[]";
}
StringBuilder builder = new StringBuilder("[");
for(int i=0;i<size;i++){
if(i !=size -1){
builder.append(elementData[i]+",");
}else{
builder.append(elementData[i]);
}
}
builder.append("]");
return builder.toString();
}
}
MyArrayIndexOutOfBoundsException.java自定义异常:
/**
* 自定义异常
* @author Administrator
*
*/
public class MyArrayIndexOutOfBoundsException extends RuntimeException{
public MyArrayIndexOutOfBoundsException() {
super();
}
public MyArrayIndexOutOfBoundsException(String message) {
super(message);
}
}
TestArrayList.java测试代码:
package com.bjsxt.datastructure.linetable;
public class TestArrayList {
public static void main(String[] args) {
java.util.ArrayList al;
List list = new ArrayList();
list.add(123);
list.add(321);
list.add(456);
list.add(678);
list.add(789);
list.add(111);
list.add(222);
list.add(20, 666);
System.out.println(list.size());
System.out.println(list.isEmpty());
System.out.println(list.get(3));
System.out.println(list.toString());
}
}