Java-动态数组实现

  • 该数组可动态扩容,缩容,支持泛型
  • 缩容是等到数组大小为四分之一容量的原因?为什么不是等到二分之一立刻缩容那?
    • 初始定义10为容量,当添加到第十个元素时,扩容为2倍,即容量为20
    • 这时,如果重复进行删除增添的操作,就会反复扩容缩容
    • 所以选择四分之一当前长度是为了留一个缓冲的 空间,防止这种情况的发生
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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package dataStructure;

public class Array<E> {
private E[] data;
private int size;

public Array(int capacity) {
data = (E[]) new Object[capacity];
size = 0;
}

public Array() {
this(10);
}

public int getSize() {
return size;
}

public int getCapacity() {
return data.length;
}

public boolean isEmpty() {
return size == 0;
}

// 在index索引位置,增加一个元素e
public void add(int index, E e) {
if (index < 0 || index > size) {
throw new IllegalArgumentException("Add failed. Array is full");
}
if (size == data.length) {
resize(2 * data.length);
}
for (int i = size - 1; i >= index; i--) {
data[i + 1] = data[i];
}
data[index] = e;
size++;
}


public void addLast(E e) {
add(size, e);
}

public void addFirst(E e) {
add(0, e);
}

// 根据index索引位置查找元素
public E get(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("Find failed. Index is illegal");
return data[index];
}

public E getLast() {
return data[size - 1];
}

public E getFirst() {
return data[0];
}

// 修改index索引位置元素为e
public void set(int index, E e) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("Find failed. Index is illegal");
data[index] = e;
}

// 判断数组中是否存在某元素e
public boolean contains(E e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e))
return true;
}
return false;
}

// 查找数组中元素e所在的索引,若不存在,返回-1
public int find(E e) {
for (int i = 0; i < size; i++) {
if (data[i] == e)
return i;
}
return -1;
}

// 删除index索引的元素,并返回元素值
public E remove(int index) {
if (index < 0 || index >= size)
throw new IllegalArgumentException("Remove failed. Index is illegal");
E ret = data[index];
for (int i = index; i < size - 1; i++) {
data[i] = data[i + 1];
}
size--;
// data[size] = null;
if (size == data.length / 4 && data.length / 2 != 0) {
resize(data.length / 2);
}
return ret;
}

public E removeFirst() {
return remove(0);
}

public E removeLast() {
return remove(size - 1);
}

// 从数组中删除元素e(第一次发现到的)
public void removeElement(E e) {
int index = find(e);
if (index != -1)
remove(index);
}

@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array: size = %d , capacity = %d\n", size, data.length));
res.append("[");
for (int i = 0; i < size; i++) {
res.append(data[i]);
if (i != size - 1) {
res.append(", ");
}
}
res.append("]");
return res.toString();
}

// 容量不够自动扩容,容量减小到一定程度,缩容
private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
}

}