自定义ArrayList(二)-数组扩容
自定义ArrayList(二)-数组扩容

接自定义数组(一),在前面的基础上加上了数组扩容的修改,这种情况是在存储的数据过大超过原先的数组容量时,为了避免数据溢出,来进行的操作。
public class SetArryList<E> {
private Object[] elementData; // 数组
private int size; // 长度
private static final int DEFALT_CAPACITY=10; //默认数组长度
public SetArryList() {
elementData = new Object[DEFALT_CAPACITY];
}
public SetArryList (int capacity) {
elementData = new Object[capacity];
}
public void add(E element) {
elementData[size++] = element;
}
@Override
public String toString() { // 重写toString方法
// TODO Auto-generated method stub
StringBuilder sBuilder = new StringBuilder();
//a,b,c
sBuilder.append("[");
for (Object object : elementData) {
/* 如果不想打出空值,即可启用该循环
* for (int i = 0; i < size; i++) { sBuilder.append(elementData[i]+","); }
*/
sBuilder.append(object+",");
}
sBuilder.append("]");
return sBuilder.toString();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
SetArryList s1 = new SetArryList(20);
s1.add("abc");
s1.add("数组");
System.out.println(s1);
}
public void add(String string) {
// TODO Auto-generated method stub
}
}
修改存储数据的容量大小
for (int i = 0; i < 40; i++) {
s1.add("#"+i);
}
此时会报错,因为数据过大,存储的时候放不进去,超过了本身的容量,此时就需要进行数组扩容,而在扩容时就需要去修改add()方法。
public void add(E element) {
// 修改add()方法
if (size == elementData.length) {
Object[] newobjects = new Object[/* elementData.length*2 */ elementData.length
+ (elementData.length << 1);
System.arraycopy(elementData, 0, newobjects, 0, elementData.length);
elementData = newobjects;
}
elementData[size++] = element;
}
扩容为原数组的二倍或者加上原数组的一半,在此要一个问题就是——计算的优先级, elementData.length+ (elementData.length << 1相当于10-->10+10/2
public static void main(String[] args) {
// TODO Auto-generated method stub
SetArrayList2 s1 = new SetArrayList2(20);
for (int i = 0; i < 40; i++) {
s1.add("#"+i); // 报错
}
/*
* s1.add("abc"); s1.add("数组");
*/
System.out.println(s1);
}
小沐CA

浙公网安备 33010602011771号