设计思路
- 泛型使用:通过在类定义时指定类型参数,确保集合中存储元素的类型安全。这样在编译期就能检查类型错误,避免运行时类型转换异常。
- 动态扩容:内部使用数组存储元素,当数组已满时,需要重新分配更大的数组空间,并将原数组元素复制到新数组。
- 基本操作实现:
- 添加元素:检查数组是否已满,若满则进行扩容,然后将元素添加到数组末尾。
- 删除元素:找到要删除元素的位置,将其后元素向前移动,最后更新数组大小。
- 获取元素:根据索引直接返回数组中对应位置的元素。
- 性能优化:
- 扩容策略:每次扩容时,选择合适的扩容因子,避免频繁扩容带来的性能开销。例如可以选择扩容为原大小的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;
}
}
代码说明
- 类定义:
CustomGenericList<T>
使用泛型 T
,确保集合中元素类型安全。
- 成员变量:
elements
数组用于存储元素,size
记录当前元素个数,DEFAULT_CAPACITY
定义初始数组容量。
- 构造函数:初始化
elements
数组为默认容量,并将 size
设为0。
- 添加方法
add
:检查数组是否已满,若满则扩容,然后将元素添加到数组末尾并更新 size
。
- 删除方法
remove
:遍历数组找到要删除元素的位置,调用 removeAt
方法删除。
removeAt
方法:将指定索引后的元素向前移动,更新 size
并将原末尾元素设为 null
以便垃圾回收。
- 获取方法
get
:根据索引返回数组中对应位置的元素,若索引越界抛出异常。
- 扩容方法
expandCapacity
:将数组容量扩大为原来的2倍,并复制原数组元素到新数组。
size
方法:返回当前集合中元素的个数。