本篇文章将详细介绍在Java编程语言中,如何利用数组来实现ArrayList的动态调整大小功能,并探讨其实现原理和方法。
Java中的ArrayList是使用数组实现的容器类型之一。尽管数组在创建时就确定了长度且之后无法更改其大小,但Java提供了动态可变长的ArrayList来解决这个问题。
一、成员变量与方法
为了模拟ArrayList的功能,在自定义类中需要包含以下成员变量和方法:
- size:表示当前存储元素的数量
- elements:用于存放实际数据的数组
常用的公共方法包括:
- size():返回列表中的元素个数
- isEmpty():判断列表是否为空
- indexOf(int element):查找指定元素的位置并返回其索引值,如果不存在则返回 -1。
- contains(int element):检查给定的元素是否存在,并基于indexOf的结果给出true或false作为回答。
- get(int index):获取在特定位置上的元素值。
- set(int index, int element):用新的值替换指定位置处的旧元素并返回被替换掉的老值。
- add(int index, int element):将新元素插入到列表中某个索引的位置或者添加到最后,如果当前数组已满,则会进行扩容操作(通常是原来的两倍)。
- remove(int index):删除指定索引位置上的元素,并将其从数组移除;同时更新size字段以反映新的长度。
- clear():清空整个ArrayList对象的内容。
二、方法实现
1. size()
```java
public int size() {
return size;
}
```
2. isEmpty()
```java
public boolean isEmpty() {
return size == 0;
}
```
3. indexOf(int element)
```java
public int indexOf(int element) {
for (int i = 0; i < size; i++) {
if (element == elements[i]) {
return i;
}
}
return -1;
}
```
4. contains(int element)
```java
public boolean contains(int element) {
return indexOf(element) != -1;
}
```
5. get(int index)
```java
public int get(int index) {
return elements[index];
}
```
6. set(int index, int element)
```java
public int set(int index, int element) {
int oldValue = elements[index];
elements[index] = element;
return oldValue;
}
```
7. add(int index, int element)
```java
public void add(int index, int element) {
if (size == elements.length) { // 当数组已满时,进行扩容操作。
int[] newElements = new int[elements.length * 2];
System.arraycopy(elements, 0, newElements, 0, elements.length);
elements = newElements;
}
for (int i = size; i > index; i--) { // 将元素插入到指定索引位置
elements[i] = elements[i - 1];
}
elements[index] = element;
size++;
}
```
8. remove(int index)
```java
public int remove(int index) {
int oldValue = elements[index];
for (int i = index; i < size - 1; i++) { // 向左移动元素覆盖被删除的位置。
elements[i] = elements[i + 1];
}
size--;
return oldValue;
}
```
9. clear()
```java
public void clear() {
size = 0;
}
```
10. toString()
为了方便查看列表中的内容,可以实现toString方法:
```java
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append([);
for (int i = 0; i < size; i++) { // 构造字符串表示形式。
if(i != 0) sb.append(, );
sb.append(elements[i]);
}
sb.append(]);
return sb.toString();
}
```
通过这些方法,可以实现一个基本的ArrayList类来满足动态数组的需求。