public class MyArrayList<E> {
private int size=0;
private E[] elements;
private static final int DEFAULT_CAPACITY=10;
private static final int ELEMENT_NOTFOUND=-1;
public MyArrayList(int capacity) {
capacity =(capacity<DEFAULT_CAPACITY)? DEFAULT_CAPACITY:capacity;
elements=(E[]) new Object[capacity];
}
public MyArrayList() {
//elements=new int[DEFAULT_CAPACITY];
this(DEFAULT_CAPACITY); //在无参数构造方法中调用有参的构造方法
}
/**
* 清楚所有的元素
* size 为0 无法访问之前存储的元素
* 动态覆盖之前的元素 size从0开始
*/
public void clear(){
//确保堆内存中不能循环利用的对象被销毁(重点)
for (int i=0;i<size;i++){
elements[i]=null;
}
size=0;
}
public int size(){
return size;
}
public boolean isEmpty(){
return size==0;
}
public boolean contains(E element){
return indexOf(element)!=ELEMENT_NOTFOUND;
}
public void add(E element){
add(size,element);
}
public void add(int index,E element){
rangeCheckforAdd(index);
ensureCapacity(size+1);//作用是确保容量值可以达到size+1
//注意扩容,最右侧的元素向右位移动,不能被覆盖
for (int i=size-1;i>=index;i--){
elements[i+1] = elements[i];
}
elements[index]=element;
size++;
}
public E get(int index){
if (index<0||index>=size){
throw new IndexOutOfBoundsException("Index:"+index+" size "+size);
}
return elements[index];
}
/**
*
* @param index
* @param element
* @return 返回原来存放的元素
*/
public E set(int index,E element){
if (index<0||index>=size){
throw new IndexOutOfBoundsException("Index:"+index+" size "+size);
}
E old = elements[index];
elements[index] = element;
return old;
}
/**
*
* @param index
* @return 返回被删除的元素
*/
public E remove(int index){
rangeCheck(index); //范围是0~size-1
// 有bug,最后一个元素的删除是通过size减一去去除
E old=elements[index];
for (int i=index;i<size-1;i++){
elements[index]=elements[index+1];
}
//上面的i取index-1;也就是删除最后一个元素,不进入for
// size--;//去掉最后一个元素了
// elements[size]=null;
//上面两句可以合成成一句
elements[--size]=null; //使用累减后的值进行运算
return old;
}
/**
* @param element
* @return 返回元素对应的下标位置
* 实现时需要注意空指针异常
*/
public int indexOf(E element){
if (element==null){
for (int i=0;i<size;i++){
if (elements[i]==null){
return i;
}
}
}
//这里要重写equals
for (int i=0;i<size;i++){
if (element.equals(elements[i])){
return i;
}
}
return ELEMENT_NOTFOUND;
}
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("size: ").append(size).append(" [");
for (int i = 0; i < size; i++) {
stringBuilder.append(elements[i]);
if (i != size - 1) {
stringBuilder.append(",");
}
}
stringBuilder.append("]");
return stringBuilder.toString();
}
//封装错误信息
private void outOfBounds(int index){
throw new IndexOutOfBoundsException("Index:"+index+" size "+size);
}
//封装indexCheck
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 ensureCapacity(int capacity){
int oldCapacity = elements.length;
if (oldCapacity>=capacity){
return;
}
int newCapacity=oldCapacity+(oldCapacity>>1); //右移操作一定要加括号
System.out.println(newCapacity);
E[] newElements=(E[])new Object[newCapacity];
for (int i=0;i<size;i++){
newElements[i]=elements[i];
}
elements=newElements;
}
}