目录
一、ArrayList 类的整体架构及代码展示
二、成员变量及其作用
1. size
2. capacity
3. arr
4. factor
三、插入操作的实现与分析
1. 普通插入(add方法)
2. 指定位置插入(insert方法)
四、删除操作的实现与分析
1. 删除第一个符合条件的数据(delFirst方法)
2. 删除所有符合条件的数据(delAll方法)
五、排序操作的实现与分析
1. 排序算法选择(sort方法)
2. 冒泡排序实现细节(sort方法)
一、ArrayList 类的整体架构及代码展示
package 数组;public class ArrayList {int size = 0; // 记录有效数据的个数int capacity = 10; // 数组容量int[] arr = new int[capacity];double factor = 1.5; // 因数 1.5// 插入public void add(int element) {if (size == capacity) {// 数组满了,扩容capacity = (int) (capacity * factor); // 强制类型转换int[] brr = new int[capacity];for (int i = 0; i < arr.length; i++) {brr[i] = arr[i];}arr = brr;}// 插入数据arr[size] = element;size++;}// 指定位置插入public void insert(int value, int position) {// 判断位置是否合理if (position > size || position < 0) {System.out.println("插入位置不合理");return;}if (size == capacity) {// 数组满了,扩容capacity = (int) (capacity * factor); // 强制类型转换int[] brr = new int[capacity];for (int i = 0; i < arr.length; i++) {brr[i] = arr[i];}arr = brr;}// 数组有空间进行插入// 插入位置及其之后的数据,从后往前的顺序统一往后移动for (int i = size - 1; i >= position; i--) {arr[i + 1] = arr[i];}// 插入arr[position] = value;size++;}// 删除第一个符合条件的数据public boolean delFirst(int value) {// 查找元素for (int j = 0; j < size; j++) {if (arr[j] == value) {// 删除,j后面的数据都要向前移动一位for (int i = j + 1; i < size; i++) {arr[i - 1] = arr[i];}size--;return true;}}return false;}// 删除所有符合条件的数据// 从后往前删,可以删干净public boolean delAll(int value) {boolean hasDeleted = false;for (int k = size - 1; k >= 0; k--) {if (arr[k] = = value) {for (int m = k + 1; m < size; m++) {arr[m - 1] = arr[m];}size--;hasDeleted = true;}}return hasDeleted;}// 将数组排序 冒泡排序public void sort() {for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - i - 1; j++) {if (arr[j] > arr[j + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}}public String toString() {String res = "[";for (int i = 0; i < size; i++) {if (i == size - 1) {res += arr[i];} else {res += arr[i] + ", ";}}res += "]";return res;}
}
在上述代码中,我们定义了ArrayList
类并将其放置在package 数组;
这个包下。下面详细介绍一下类中的各个部分。
二、成员变量及其作用
1. size
size
变量用于精确记录数组中有效数据的个数。这一变量在整个类的操作逻辑中起着至关重要的作用,它使得我们在进行各种数组操作时,能够清晰地知晓当前实际存储了多少有意义的数据,从而避免对未使用的数组空间进行不必要的处理。
2. capacity
capacity
代表数组的初始容量,这里我们将其设定为10
。它界定了数组在不进行扩容操作时能够容纳元素的数量上限。当数组中的有效数据数量达到这个上限时,就需要进行扩容处理,以满足继续添加数据的需求。
3. arr
arr
是一个整型数组,它是我们实际存储数据的载体。其大小由capacity
决定,在数组初始化时就被创建出来,后续所有的数据插入、删除以及排序等操作都是围绕这个数组展开的。
4. factor
factor
被定义为一个因数,具体取值为1.5
。它主要应用于数组扩容操作,当数组满了需要扩容时,通过将当前容量乘以这个因数来计算出新的容量大小,从而为数组开辟出更多的存储空间。
三、插入操作的实现与分析
1. 普通插入(add
方法)
add
方法实现了向数组末尾添加一个新元素的功能。当我们调用add
方法并传入一个元素时,它首先会检查数组是否已满,也就是判断size
是否等于capacity
。一旦发现数组已满,就会触发扩容机制。扩容过程如下:
- 首先,通过
capacity = (int) (capacity * factor);
计算出新的容量,这里需要进行强制类型转换,因为capacity * factor
的结果可能是一个小数,而数组容量必须是整数。 - 接着,创建一个新的更大的数组
brr
,其大小为新计算出的容量。 - 然后,通过循环将原数组
arr
中的数据依次复制到新数组brr
中,即for (int i = 0; i < arr.length; i++) { brr[i] = arr[i]; }
。 - 最后,将
arr
指向新数组,完成扩容操作。
在完成扩容后,就可以将新元素插入到数组末尾,通过arr[size] = element;
实现,然后将size
的值增加1
,以反映数组中有效数据的增加。
2. 指定位置插入(insert
方法)
insert
方法允许我们在指定位置插入一个元素。在调用这个方法时,需要传入要插入的元素值value
和插入位置position
。首先会对插入位置进行合理性检查,如果position
大于size
或者小于0
,就会输出提示信息并直接返回,因为这样的插入位置是不合理的。
若数组已满,同样会触发扩容操作,其扩容逻辑与add
方法中的扩容逻辑一致。当确定数组有空间进行插入并且插入位置合理后,会将插入位置及其之后的数据从后往前依次往后移动一位,为新元素腾出空间。具体实现是通过循环for (int i = size - 1; i >= position; i--) { arr[i + 1] = arr[i]; }
完成的。
完成数据移动后,就可以将新元素插入到指定位置,通过arr[position] = value;
实现,最后将size
的值增加1
。
四、删除操作的实现与分析
1. 删除第一个符合条件的数据(delFirst
方法)
delFirst
方法的作用是删除数组中第一个与传入值value
相等的元素。它通过遍历数组,从第一个元素开始(索引为0
)到第size
个元素(不包括),查找是否存在与value
相等的元素。一旦找到匹配的元素,就会将该元素后面的数据都向前移动一位,即将索引为i + 1
(i
为找到匹配元素的索引)的元素赋值给索引为i
的位置,具体通过循环for (int i = j + 1; i < size; i++) { arr[i - 1] = arr[i]; }
实现。然后size
的值减1
,表示数组中有效数据减少了一个。如果遍历完整个数组都没有找到匹配的元素,就会返回false
。
2. 删除所有符合条件的数据(delAll
方法)
delAll
方法用于删除数组中所有与某个值相等的元素。它从数组的末尾开始,即从索引为size - 1
的元素开始,向前遍历到第一个元素(索引为0
)。每当找到一个与value
相等的元素,就会将该元素后面的数据向前移动一位,然后size
的值减1
。在这个过程中,会通过一个布尔变量hasDeleted
来记录是否至少删除了一个元素,最后返回这个布尔变量的值,以告知调用者是否有元素被删除。具体实现时,通过循环for (int k = size - 1; k >= 0; k--) { if (arr[k] == value) { for (int m = k + 1; k < size; m++) { arr[m - 1] = k < size && arr[m]; } size--; hasDeleted = true; } }
完成操作。
五、排序操作的实现与分析
1. 排序算法选择(sort
方法)
为了让数组中的数据能够按照一定的顺序排列,我们在sort
方法中采用了经典的冒泡排序算法。冒泡排序的基本思想是通过多次比较相邻的元素,如果它们的顺序不符合排序要求(在我们这里是升序,即前面的元素大于后面的元素时),就交换它们的位置。
2. 冒泡排序实现细节(sort
方法)
在sort
方法中,我们使用了两层嵌套的循环。外层循环控制排序的轮数,总共需要进行size - 1
轮排序,因为经过size - 1
轮后,数组中的最小元素自然就会处于数组的开头位置。内层循环用于在每一轮排序中比较相邻的元素,从第一个元素开始(索引为 0)到第size - i - 1
个元素(i
为当前排序轮数)。当发现相邻元素满足arr[j] > arr[j + 1]
的条件时(即前面的元素大于后面的元素),就通过一个临时变量temp
来交换它们的位置,使得较大的元素逐渐 “可泡” 到数组的末尾,经过多轮循环后,数组就会被排序成升序状态。具体实现如下:
- 外层循环:
for (int i = 0; i < size - 1; i++) { }
- 内层循环:
for (int j = 0; j < size - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } }