MST

星途 面试题库

面试题:自定义Java集合类并实现迭代器

请自定义一个简单的Java集合类,例如MyList,用于存储整数类型数据。要求在这个类中实现迭代器接口,使得该集合类可以使用迭代器进行遍历。同时,要考虑到迭代过程中的增删操作如何与迭代器的一致性保持协调,编写完整的代码并解释关键实现步骤。
20.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyList implements Iterable<Integer> {
    private int[] data;
    private int size;

    public MyList() {
        data = new int[16];
        size = 0;
    }

    public void add(int num) {
        if (size == data.length) {
            resize();
        }
        data[size++] = num;
    }

    private void resize() {
        int[] newData = new int[data.length * 2];
        System.arraycopy(data, 0, newData, 0, size);
        data = newData;
    }

    @Override
    public Iterator<Integer> iterator() {
        return new MyListIterator();
    }

    private class MyListIterator implements Iterator<Integer> {
        private int current = 0;
        private boolean canRemove = false;

        @Override
        public boolean hasNext() {
            return current < size;
        }

        @Override
        public Integer next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            canRemove = true;
            return data[current++];
        }

        @Override
        public void remove() {
            if (!canRemove) {
                throw new IllegalStateException();
            }
            canRemove = false;
            System.arraycopy(data, current, data, current - 1, size - current);
            size--;
            current--;
        }
    }
}

关键实现步骤解释

  1. 数据存储
    • 使用一个int类型的数组data来存储整数数据。
    • size变量记录当前集合中实际存储的元素个数。
    • 构造函数初始化数组大小为16,当元素个数达到数组大小时,通过resize方法将数组大小翻倍。
  2. 迭代器实现
    • MyList类实现了Iterable<Integer>接口,并重写iterator方法,返回一个MyListIterator实例。
    • MyListIterator类实现了Iterator<Integer>接口,包含hasNextnextremove方法。
    • hasNext方法检查是否还有下一个元素,即current是否小于size
    • next方法返回当前位置的元素,并将current指针后移一位。同时设置canRemovetrue,表示可以进行删除操作。
    • remove方法删除当前迭代器指向的元素。在删除前先检查canRemove,若为false则抛出IllegalStateException。删除元素后,通过System.arraycopy方法将后续元素向前移动一位,并更新sizecurrent。这样保证了迭代过程中的增删操作与迭代器的一致性。