包名:p2_myarray
知识点:构造方法、数组扩容、方法封装、增删改查、元素前移、冒泡排序
模仿
ArrayList的底层原理,自己动手实现一个可变数组(动态数组)。
Java 中普通数组 int[] 一旦创建,长度就固定了,无法动态增减元素。请自行实现一个 可变整型数组 MyArray 类,内部使用 int[] 存储数据,对外提供便捷的增删改查方法。
私有属性:
| 属性 | 类型 | 说明 |
|---|---|---|
data |
int[] |
内部真正存储数据的数组 |
size |
int |
当前已存储的元素个数(不是数组长度) |
构造方法:
| 构造方法 | 说明 |
|---|---|
MyArray() |
无参构造,默认初始化容量为 10 的数组 |
MyArray(int capacity) |
指定初始容量,如果传入的容量 ≤ 0,则使用默认容量 10 |
add(int element)data.length * 3 / 2)data 引用data[size],size 自增 1get(int index)"下标越界,无法获取元素",返回 -1data[index]set(int index, int element)"下标越界,无法修改元素"data[index] 赋值为 elementsize()size 属性值capacity()data.lengthisEmpty()size == 0 返回 true,否则 falseindexOf(int element)-1contains(int element)indexOf(),根据返回值是否为 -1 判断remove(int index)"下标越界,无法删除元素",返回 -1size-- → 返回被删除的值removeByValue(int element)indexOf() 获取下标-1 则输出 "未找到该元素,删除失败",返回 falseremove(index),返回 truesort(boolean ascending)true 升序,false 降序data[0] ~ data[size-1] 排序print()[元素1, 元素2, 元素3, ...][]clear()size 置为 0(内部数组保留)MyArrayTest 类:
public class MyArrayTest {
public static void main(String[] args) {
// 1. 创建一个初始容量为 3 的 MyArray 对象
MyArray arr = new MyArray(3);
// 2. 输出初始状态
System.out.println("初始容量:" + arr.capacity()); // 3
System.out.println("是否为空:" + arr.isEmpty()); // true
// 3. 添加 5 个元素(触发自动扩容)
for (int i = 1; i <= 5; i++) {
arr.add(i * 10); // 添加 10, 20, 30, 40, 50
}
arr.print(); // [10, 20, 30, 40, 50]
// 4. 测试各个方法
System.out.println("元素个数:" + arr.size()); // 5
System.out.println("当前容量:" + arr.capacity()); // 6
System.out.println("下标2的元素:" + arr.get(2)); // 30
System.out.println("是否包含40:" + arr.contains(40)); // true
System.out.println("50的下标:" + arr.indexOf(50)); // 4
// 5. 测试修改
arr.set(1, 99);
arr.print(); // [10, 99, 30, 40, 50]
// 6. 测试删除
int deleted = arr.remove(2);
System.out.println("被删除的元素:" + deleted); // 30
arr.print(); // [10, 99, 40, 50]
// 7. 测试按值删除
arr.removeByValue(10);
arr.print(); // [99, 40, 50]
// 8. 测试升序排序
arr.sort(true);
arr.print(); // [40, 50, 99]
// 9. 测试降序排序
arr.sort(false);
arr.print(); // [99, 50, 40]
// 10. 测试越界访问
System.out.println(arr.get(10)); // 下标越界,无法获取元素 → -1
arr.remove(10); // 下标越界,无法删除元素 → -1
}
}
add() 方法中每次只扩容 1 个容量(data.length + 1),当添加大量元素时性能会怎样?为什么选择 1.5 倍?remove() 方法中为什么要将后面的元素向前移动?如果删除的是最后一个元素还需要移动吗?MyArray 改造为支持任意类型的 MyArrayList<T>?