package com.bjsxt.ds.linelist;
import java.util.Arrays;
public class ArrayList implements List {
private Object[] elementData; // 底层数组来存储多个元素
private int size;// 存储的元素的个数,线性表的长度,注意,不是数组的长度
public ArrayList() {
// 查看真实的ArrayList无参数构造方法是怎么实现的
this(2);
// this.elementData = new Object[]{};
// this.elementData = new Object[0];
}
/**
*
* @param initialCapacity
*/
public ArrayList(int initialCapacity) {
// 如果initialCapacity<0,抛出异常
if (initialCapacity < 0) {
throw new RuntimeException("初始长度要大于0:" + initialCapacity);
}
// 按照初始长度给数组分配空间
elementData = new Object[initialCapacity];
// 指定线性表初始元素个数,可以省略,int成员变量默认值0
// this.size = 0;
}
@Override
public int size() {
return size;
}
@Override
public Object get(int i) {
// 对i的值进行判断
if (i >= size) {
// throw new RuntimeException("数组指针越界异常:"+i);
throw new IndexOutOfBoundsException("数组指针越界异常:" + i);
}
return elementData[i];
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean contains(Object e) {
// 逐个判断各个元素是否与要查询元素内容相同,效率低下
// 注意不是elementData.length,而是size
// for(int i =0;i<size;i++){
// if(e.equals(elementData[i])){
// return true;
// }
// }
// return false;
return this.indexOf(e) >= 0;
}
@Override
public int indexOf(Object e) {
// 逐个判断各个元素是否与要查询元素内容相同,效率低下
// 注意不是elementData.length,而是size
// 有漏洞,如果e是null呢?使用if分别处理
for (int i = 0; i < size; i++) {
if (e.equals(elementData[i])) {
return i;
}
}
return -1;
}
@Override
public void add(int i, Object e) {
// 如果i超过了size,抛出异常
if (i > size || i < 0) {
// throw new RuntimeException("数组指针越界异常:"+i);
throw new IndexOutOfBoundsException("数组指针越界异常:" + i);
}
// 需要先判断length是否足够,如果已经满,需要扩容
if (size == this.elementData.length) {// 满了
grow();
}
// 添加元素
// 从后向前后移后面元素一个位置
for (int j = size; j > i; j--) {
this.elementData[j] = this.elementData[j - 1];
}
// 添加元素到指定位置
this.elementData[i] = e;
// 元素个数+1
this.size++;
}
@Override
public void add(Object e) {
// 需要先判断length是否足够,如果已经满,需要扩容
if (size == this.elementData.length) {// 满了
grow();
}
// 增加元素
this.elementData[size] = e;
// 元素长度+1
size++;
// 可以合并为一条语句
// this.elementData[size++] = e;
}
public void grow() {
// //创建一个新的更长数组:策略,增长多少? 100% 50%
// Object [] newArr = new Object [this.elementData.length *2];
// //将旧数组数据放入新数组
// for(int i=0;i<this.elementData.length;i++){
// newArr[i] = this.elementData[i];
//
// }
// //旧数组引用指向新数组
// this.elementData = newArr;
elementData = Arrays.copyOf(elementData, this.elementData.length * 2);
}
@Override
public boolean addBefore(Object obj, Object e) {
return false;
}
@Override
public boolean addAfter(Object obj, Object e) {
return false;
}
@Override
public Object remove(int i) {
return null;
}
@Override
public boolean remove(Object e) {
return false;
}
@Override
public Object replace(int i, Object e) {
return null;
}
@Override
public String toString() {
if (this.size == 0) {
return "[ ]";
}
StringBuilder builder = new StringBuilder();
builder.append('[');
for (int i = 0; i < size; i++) {
if (i != size - 1) {
builder.append(this.get(i) + ",");
} else {
builder.append(this.get(i));
}
}
builder.append("]");
return builder.toString();
}
}
/**
* 自定义数组越界异常
* @author Administrator
*
*/
public class IndexOutOfBoundsException extends RuntimeException{
public IndexOutOfBoundsException() {
}
public IndexOutOfBoundsException(String message) {
super(message);
}
}
测试类
package com.bjsxt.ds.linelist;
public class Test {
public static void main(String[] args) {
//创建线性顺序表
List list = new ArrayList();
//向末尾添加元素
list.add("11111");
list.add("aaaaa");
list.add("bbbbb");
list.add("33333");
list.add("22222");
list.add(3, "AAAAA");
//进行各种操作验证添加
System.out.println(list.size());
System.out.println(list.isEmpty());
System.out.println(list.contains("44444"));
System.out.println(list.indexOf("22222"));
System.out.println(list.toString());
}
}