Здесь приводится упрощенная версия класса java.util.ArrayList.
----------------------------------------------------------------
-- Код:
import java.util.Arrays;
import java.util.Iterator;
public class XArrayList implements Iterable {
private Object[] data;
private int size = 0;
public XArrayList() {
this(10);
}
public XArrayList(int initialCapacity) {
this.data = new Object[initialCapacity];
}
public void add(Object element) {
ensureCapacity(size + 1);
data[size++] = element;
}
public void add(int index, Object element) {
ensureCapacity(size + 1);
System.arraycopy(data, index, data, index + 1, size - index);
data[index] = element;
size++;
}
public Object get(int index) {
rangeCheck(index);
return data[index];
}
public Object set(int index, Object element) {
rangeCheck(index);
Object oldValue = data[index];
data[index] = element;
return oldValue;
}
public Object remove(int index) {
rangeCheck(index);
Object oldValue = data[index];
int numMoved = size - index - 1;
System.arraycopy(data, index + 1, data, index, numMoved);
data[--size] = null;
return oldValue;
}
@Override
public Iterator iterator() {
return new Iterator() {
private int iteratorIndex = 0;
@Override
public boolean hasNext() {
return iteratorIndex < size;
}
@Override
public Object next() {
return data[iteratorIndex++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public int size() {
return size;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[");
for (int k = 0; k < size; k++) {
builder.append(data[k]);
if (k < size - 1) {
builder.append(", ");
}
}
builder.append("]");
return builder.toString();
}
private void ensureCapacity(int minCapacity) {
if (minCapacity > size) {
int newCapacity = 1 + (3 * data.length) / 2;
Object[] tmpData = new Object[newCapacity];
System.arraycopy(data, 0, tmpData, 0, data.length);
data = tmpData;
}
}
private void rangeCheck(int index) {
if (index >= size || 0 > index) {
throw new IndexOutOfBoundsException();
}
}
}
class XArrayListTest {
public static void main(String[] args) {
XArrayList list = new XArrayList(1);
list.add(0); //[0]
list.add(1); //[0, 1]
list.add(2); //[0, 1, 2]
list.add(3); //[0, 1, 2, 3]
list.add(4); //[0, 1, 2, 3, 4]
list.remove(2); //[0, 1, 3, 4]
list.add(0, 10); //[10, 0, 1, 3, 4]
list.add(1, 20); //[10, 20, 0, 1, 3, 4]
for (Object element : list) {
System.out.print(element + " ");
}
System.out.println();
System.out.print(list);
}
}
----------------------------------------------------------------
----------------------------------------------------------------
-- Код:
import java.util.Arrays;
import java.util.Iterator;
public class XArrayList implements Iterable {
private Object[] data;
private int size = 0;
public XArrayList() {
this(10);
}
public XArrayList(int initialCapacity) {
this.data = new Object[initialCapacity];
}
public void add(Object element) {
ensureCapacity(size + 1);
data[size++] = element;
}
public void add(int index, Object element) {
ensureCapacity(size + 1);
System.arraycopy(data, index, data, index + 1, size - index);
data[index] = element;
size++;
}
public Object get(int index) {
rangeCheck(index);
return data[index];
}
public Object set(int index, Object element) {
rangeCheck(index);
Object oldValue = data[index];
data[index] = element;
return oldValue;
}
public Object remove(int index) {
rangeCheck(index);
Object oldValue = data[index];
int numMoved = size - index - 1;
System.arraycopy(data, index + 1, data, index, numMoved);
data[--size] = null;
return oldValue;
}
@Override
public Iterator iterator() {
return new Iterator() {
private int iteratorIndex = 0;
@Override
public boolean hasNext() {
return iteratorIndex < size;
}
@Override
public Object next() {
return data[iteratorIndex++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public int size() {
return size;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("[");
for (int k = 0; k < size; k++) {
builder.append(data[k]);
if (k < size - 1) {
builder.append(", ");
}
}
builder.append("]");
return builder.toString();
}
private void ensureCapacity(int minCapacity) {
if (minCapacity > size) {
int newCapacity = 1 + (3 * data.length) / 2;
Object[] tmpData = new Object[newCapacity];
System.arraycopy(data, 0, tmpData, 0, data.length);
data = tmpData;
}
}
private void rangeCheck(int index) {
if (index >= size || 0 > index) {
throw new IndexOutOfBoundsException();
}
}
}
class XArrayListTest {
public static void main(String[] args) {
XArrayList list = new XArrayList(1);
list.add(0); //[0]
list.add(1); //[0, 1]
list.add(2); //[0, 1, 2]
list.add(3); //[0, 1, 2, 3]
list.add(4); //[0, 1, 2, 3, 4]
list.remove(2); //[0, 1, 3, 4]
list.add(0, 10); //[10, 0, 1, 3, 4]
list.add(1, 20); //[10, 20, 0, 1, 3, 4]
for (Object element : list) {
System.out.print(element + " ");
}
System.out.println();
System.out.print(list);
}
}
----------------------------------------------------------------