数据结构之线性顺序表ArrayList(Java实现)

一、ListMe接口:

import java.util.ArrayList;

//实现线性表(顺序表和链表)的接口:
//提供add get isEmpty size 功能
public interface ListMe<E> {
//返回线性表大小:线性表元素个数,非底层数组长度
public int size();

//添加元素,追加在线性表最后
public void add(E e);

//(方法重载)添加元素,追加在线性表的index下标位置(插入)
public void add(E e, int index);

//返回线性表index位置的元素
public E get(int index);

//判断线性表是否为空;(非数组长度而是线性表元素个数是否为0)
public boolean isEmpty();

//窥视底层数组长度变化
public void getElementData();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
二、ArrayLisMe实现:

import java.util.Arrays;

//线性顺序表的实现
public class ArrayListMe<E> implements ListMe<E>{
//创建存储线性表的数组
E[] elementData;

//创建线性顺序表的大小(元素个数初始化)
private int size;

//空参构造器,调用下面的构造器,默认设置5个初始化数组长度
public ArrayListMe(){
this(5);
}

//在构造器中创建数组对象,并根据给定值分配初始空间
public ArrayListMe(int length) {
this.elementData=(E[])new Object[length];
}

@Override
public int size() {
//返回元素个数
return size;
}
//动态更新线性表储存容量,即底层数组大小(增加原来数组长度的一半大小)
public void grow(){
if(size==elementData.length)
elementData=Arrays.copyOf(elementData,elementData.length+(elementData.length>>1));
}
@Override
public void add(E e) {
//判断是否需要动态增加长度
grow();
//添加在顺序线性表最后面
elementData[size++]=e;
}

@Override
public void add(E e, int index) {
//判断是否需要动态增加长度
grow();

//移动元素
for(int i=size;i>index;i--){
elementData[i]=elementData[i-1];
}

//添加元素
elementData[index]=e;
}

//判断是否指定index位置会造成下标越界(抛异常)
public void indexException(int index){
if(index<0 || index>=size)
throw new RuntimeException("顺序表越界");
}

@Override
public E get(int index) {

indexException(index);

return elementData[index];
}

@Override
public boolean isEmpty() {
//判断线性顺序表是否为空(无元素)
return size==0;
}

//显示线性顺序表所有元素
@Override
public String toString() {
StringBuilder sb=new StringBuilder("[");

for(int i=0;i<size;i++){
if(i!=size-1)
sb.append(elementData[i]+",");
else
sb.append(elementData[i]+"]");
}
return sb.toString();
}

public void getElementData(){
//窥视底层数组长度变化
System.out.println("底层数组长度:"+elementData.length);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
三、测试类:

public class TestArrayListMe {
//测试
public static void main(String s[]){
ListMe<Integer> listMe=new ArrayListMe<Integer>();

System.out.println(listMe.isEmpty());

listMe.add(0);
listMe.add(1);
listMe.add(2);
listMe.add(3);
listMe.add(4);

System.out.println(listMe.isEmpty());

listMe.get(4);

System.out.println("顺序表元素个数:"+listMe.size());

listMe.getElementData();

System.out.println(listMe.toString());

// listMe.get(5);

listMe.add(5);

System.out.println("顺序表元素个数:"+listMe.size());

listMe.getElementData(http://www.my516.com);

}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

---------------------

原文地址:https://www.cnblogs.com/ly570/p/11084007.html