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实现一个动态数组
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...