package com.shixianjun;
@SuppressWarnings("unchecked")
public class ArrayList<E> {
private static final int DEFAULT_CAPACITY = 10;
private static final int ELEMENT_NOT_FOUND = -1;
private int size;
private E[] elements;
public ArrayList(){
this(DEFAULT_CAPACITY);
}
public ArrayList(int capacity){
capacity = capacity < DEFAULT_CAPACITY ? DEFAULT_CAPACITY : capacity;
elements = (E[]) new Object[capacity];
}
/// 数组大小
public int size() {
return size;
}
/// 是否为空
public boolean isEmpty() {
return size == 0;
}
/// 是否包含某元素
boolean contains(E element) {
return indexOf(element) != ELEMENT_NOT_FOUND;
}
/// 添加元素
void add(E element) {
this.add(size, element);
}
/// 返回index位置对应的元素
E get(int index) {
this.rangeCheck(index);
return elements[index];
}
/// 替换index位置的元素
E replace(int index, E element) {
this.rangeCheck(index);
E oldE = elements[index];
elements[index] = element;
return oldE;
}
// 向index位置添加元素
void add(int index, E element) {
this.rangeCheckForAdd(index);
this.ensureCapacity(size + 1);
for (int i = size; i > index; i--) elements[i] = elements[i - 1];
elements[index] = element;
size++;
}
/// 删除index位置的元素
E remove(int index) {
this.rangeCheck(index);
E oldE = elements[index];
for (int i = index + 1; i < size; i++) {
elements[i-1] = elements[i];
}
elements[--size] = null;
return oldE;
}
/// 查看元素的位置
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++) {
if (element.equals(elements[i])) return i;
}
}
return ELEMENT_NOT_FOUND;
}
/// 清除所有元素
void clear() {
for (int i = 0; i < size; i++) elements[i] = null;
size = 0;
}
private void rangeCheck(int index) {
if (index < 0 || index >= size) outOfBounds(index);
}
private void rangeCheckForAdd(int index) {
if (index < 0 || index > size) outOfBounds(index);
}
private void outOfBounds(int index) {
throw new IndexOutOfBoundsException("index:" + index + ", size:" + size);
}
private void ensureCapacity(int capacity) {
int oldCapaticy = elements.length;
if (oldCapaticy >= capacity) return;
int newCapacity = oldCapaticy + oldCapaticy << 2;
E[] newElements = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newElements[i] = elements[i];
}
elements = newElements;
System.out.println(oldCapaticy + "扩容为" + newCapacity);
}
}
用Java实现一个动态数组
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。