推荐答案
// www.javascriptcn.com code example
import java.util.AbstractCollection;
import java.util.Iterator;
public class CustomCollection<E> extends AbstractCollection<E> {
private E[] elements;
private int size;
@SuppressWarnings("unchecked")
public CustomCollection(int initialCapacity) {
this.elements = (E[]) new Object[initialCapacity];
this.size = 0;
}
@Override
public boolean add(E e) {
if (size == elements.length) {
resize();
}
elements[size++] = e;
return true;
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < size;
}
@Override
public E next() {
return elements[currentIndex++];
}
};
}
@Override
public int size() {
return size;
}
private void resize() {
@SuppressWarnings("unchecked")
E[] newElements = (E[]) new Object[elements.length * 2];
System.arraycopy(elements, 0, newElements, 0, size);
elements = newElements;
}
}本题详细解读
1. 继承 AbstractCollection
AbstractCollection 是 Java 集合框架中的一个抽象类,它提供了集合类的基本实现。通过继承 AbstractCollection,我们可以减少实现自定义集合类时需要覆盖的方法数量。只需要实现 iterator() 和 size() 方法即可。
2. 实现 add() 方法
add() 方法用于向集合中添加元素。在这个实现中,我们首先检查数组是否已满,如果已满则调用 resize() 方法扩展数组容量。然后将新元素添加到数组的末尾,并增加 size 计数。
3. 实现 iterator() 方法
iterator() 方法返回一个 Iterator 对象,用于遍历集合中的元素。我们在这里实现了一个匿名内部类,覆盖了 hasNext() 和 next() 方法,以便能够遍历数组中的元素。
4. 实现 size() 方法
size() 方法返回集合中当前元素的数量。在这个实现中,我们直接返回 size 变量的值。
5. resize() 方法
resize() 方法用于扩展数组的容量。当数组已满时,我们创建一个新的数组,容量是原数组的两倍,并将原数组中的元素复制到新数组中。
6. 泛型支持
通过使用泛型 E,我们的自定义集合类可以存储任意类型的对象。这使得集合类更加灵活和通用。
7. 注意事项
- 这个实现是一个简单的示例,实际应用中可能需要考虑更多的边界情况和性能优化。
- 如果需要支持删除操作,还需要实现
remove()方法。 - 如果需要支持并发访问,还需要考虑线程安全问题。