ArrayList和CircularArrayList之间的主要区别是在移除元素时的行为不同。
在ArrayList中,当从列表中移除一个元素时,后面的元素会向前移动以填补空缺。例如:
ArrayList list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.remove(1);
System.out.println(list); // 输出 [1, 3]
在上面的例子中,移除索引为1的元素2后,元素3会向前移动填补空缺。
而在CircularArrayList中,当从列表中移除一个元素时,列表中的元素保持不变,只是移动了起始索引。例如:
CircularArrayList list = new CircularArrayList<>(Arrays.asList(1, 2, 3));
list.remove(1);
System.out.println(list); // 输出 [1, 3]
在上面的例子中,移除索引为1的元素2后,起始索引会从1移动到2,但元素3仍然保持在列表中。
为了实现CircularArrayList,可以通过继承ArrayList并重写remove()方法来实现。下面是一个简单的示例代码:
import java.util.ArrayList;
import java.util.List;
public class CircularArrayList extends ArrayList {
private int startIndex = 0;
public CircularArrayList() {
super();
}
public CircularArrayList(List list) {
super(list);
}
@Override
public E remove(int index) {
int circularIndex = (startIndex + index) % size();
E removedElement = get(circularIndex);
super.remove(circularIndex);
if (circularIndex < startIndex) {
startIndex--;
}
return removedElement;
}
}
使用这个CircularArrayList的示例代码如下:
CircularArrayList list = new CircularArrayList<>(Arrays.asList(1, 2, 3));
list.remove(1);
System.out.println(list); // 输出 [1, 3]
这样就可以实现一个具有循环特性的列表,移除元素时只是移动了起始索引而不是改变元素位置。
下一篇:ArrayList和迭代