MST

星途 面试题库

面试题:Java集合框架中自定义泛型集合与泛型方法的深度优化

假设你要设计一个自定义的泛型集合类,该集合类内部使用数组存储元素,支持动态扩容。要求:1. 正确使用泛型确保类型安全;2. 实现添加、删除、获取元素等基本操作;3. 对泛型方法进行优化,例如考虑性能、类型兼容性等方面。请详细说明设计思路并给出核心代码实现。
35.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 泛型使用:通过在类定义时指定类型参数,确保集合中存储元素的类型安全。这样在编译期就能检查类型错误,避免运行时类型转换异常。
  2. 动态扩容:内部使用数组存储元素,当数组已满时,需要重新分配更大的数组空间,并将原数组元素复制到新数组。
  3. 基本操作实现
    • 添加元素:检查数组是否已满,若满则进行扩容,然后将元素添加到数组末尾。
    • 删除元素:找到要删除元素的位置,将其后元素向前移动,最后更新数组大小。
    • 获取元素:根据索引直接返回数组中对应位置的元素。
  4. 性能优化
    • 扩容策略:每次扩容时,选择合适的扩容因子,避免频繁扩容带来的性能开销。例如可以选择扩容为原大小的2倍。
    • 类型兼容性:泛型类型参数应尽量通用,避免不必要的类型限制,同时在操作过程中,确保类型转换的安全性。

核心代码实现(以Java为例)

import java.util.Arrays;

public class CustomGenericList<T> {
    private T[] elements;
    private int size;
    private static final int DEFAULT_CAPACITY = 16;

    public CustomGenericList() {
        this.elements = (T[]) new Object[DEFAULT_CAPACITY];
        this.size = 0;
    }

    // 添加元素方法
    public void add(T element) {
        if (size == elements.length) {
            expandCapacity();
        }
        elements[size++] = element;
    }

    // 删除元素方法
    public boolean remove(T element) {
        for (int i = 0; i < size; i++) {
            if (elements[i].equals(element)) {
                removeAt(i);
                return true;
            }
        }
        return false;
    }

    // 根据索引删除元素方法
    private void removeAt(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        for (int i = index; i < size - 1; i++) {
            elements[i] = elements[i + 1];
        }
        elements[--size] = null;
    }

    // 获取元素方法
    public T get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException();
        }
        return elements[index];
    }

    // 扩容方法
    private void expandCapacity() {
        int newCapacity = elements.length * 2;
        elements = Arrays.copyOf(elements, newCapacity);
    }

    // 获取当前集合大小
    public int size() {
        return size;
    }
}

代码说明

  1. 类定义CustomGenericList<T> 使用泛型 T,确保集合中元素类型安全。
  2. 成员变量elements 数组用于存储元素,size 记录当前元素个数,DEFAULT_CAPACITY 定义初始数组容量。
  3. 构造函数:初始化 elements 数组为默认容量,并将 size 设为0。
  4. 添加方法 add:检查数组是否已满,若满则扩容,然后将元素添加到数组末尾并更新 size
  5. 删除方法 remove:遍历数组找到要删除元素的位置,调用 removeAt 方法删除。
  6. removeAt 方法:将指定索引后的元素向前移动,更新 size 并将原末尾元素设为 null 以便垃圾回收。
  7. 获取方法 get:根据索引返回数组中对应位置的元素,若索引越界抛出异常。
  8. 扩容方法 expandCapacity:将数组容量扩大为原来的2倍,并复制原数组元素到新数组。
  9. size 方法:返回当前集合中元素的个数。