1. 动态数组需要实现的接口2. 需要注意的点3. 代码
1. 动态数组需要实现的接口1. int size();//元素的数量 2. boolean isEmpty();//是否为空 3. boolean contains(E element);//是否包含某个元素 4. void add(E element);//添加元素到最后面 5. E get(int index);返回index位置对应的元素 6. E set(int index,E element);//设置index位置的元素 7. void add(int index,E element);//往index位置添加元素 8. int indexOf(E element);//查看元素的位置 9. void clear();//清除所有的元素2. 需要注意的点
在下面代码中,new Object在堆空间中存放的是内存的地址,真实的对象还没有没创建,只有当引用指向内存地址时该对象才真正被创建。
elements = (E[]) new Object[capacity];
清除所有元素时,只需要将存地址的指针指向null,而不应该element指向null,这样会多次频繁申请空间
public void clear() {
for (int i = 0; i < size; i++) {
elements[i]=null;
}
}
3. 代码
package com.fx.arrayList;
import java.util.Arrays;
@SuppressWarnings("unchecked")
public class ArrayList {
private int size;//元素的数量
private E[] elements;//所有的元素
private static final int DEFAULT_CAPACITY = 10;//默认存放十个元素
private static final int ELEMENT_NOT_FOUND = -1;//没有找到元素的返回值
public ArrayList() {
this(DEFAULT_CAPACITY);
}
//通过构造器传入元素的容量
public ArrayList(int capacity) {
capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
elements = (E[]) new Object[capacity];
}
public void add(int index, E element) {
//注意这里的范围判断要变大一位,表示可以在末尾插入元素
rangeCheckForAdd(index);
ensureCapacity(size + 1);
for (int i = size; i > index; i--) {
elements[i] = elements[i - 1];
}
elements[index] = element;
size++;
}
public void add(E element) {
add(size, element);
}
public E remove(int index) {
rangeCheck(index);
E oldElement = elements[index];
for (int i = index; i < size; i++) {
elements[i] = elements[i + 1];
}
//存放对象的数组需要移除最后一个元素防止浪费空间
elements[--size]=null;
return oldElement;
}
public void clear() {
for (int i = 0; i < size; i++) {
elements[i]=null;
}
size=0;
}
public boolean contains(E element){
return indexOf(element) >= 0;
}
public int indexOf(E element) {
if(element==null){
for (int i = 0; i < size; i++) {
if (elements[i]==null) return i;
}
}else {
for (int i = 0; i < size; i++) {
//让使用者指定E的比较方法,如未指定,即比较内存地址
if (element.equals(elements[i])) {
return i;
}
}
}
return ELEMENT_NOT_FOUND;
}
public E set(int index, E element) {
rangeCheck(index);
E oldElement = elements[index];
elements[index] = element;
return oldElement;
}
public E get(int index) {
rangeCheck(index);
return elements[index];
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
@Override
public String toString() {
StringBuilder sbf = new StringBuilder();
sbf.append("size=").append(size).append(",[");
for (int i = 0; i < size; i++) {
if (i != 0) {
sbf.append(", ");
}
sbf.append(elements[i]);
}
sbf.append("]");
return sbf.toString();
}
private void ensureCapacity(int capacity) {
int oldCapacity = elements.length;
if (capacity < oldCapacity) return;
//扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
elements = Arrays.copyOf(elements, newCapacity);
}
private void rangeCheckForAdd(int index) {
if (index < 0 || index > size) {
outOfBound(index);
}
}
private void rangeCheck(int index) {
if (index < 0 || index > size - 1) {
outOfBound(index);
}
}
private void outOfBound(int index) {
throw new IndexOutOfBoundsException("索引值不合法,index=" + index + ",实际大小size=" + size);
}
}



