day11
数组
手写ArrayList
ArrayList类是一个特殊的数组。通过添加和删除元素,就可以动态改变数组的长度。
一.优点
1。支持自动改变大小的功能
2。可以灵活的插入元素
3。可以灵活的删除元素
二.局限性
跟一般的数组比起来,速度上差些
public class ArrayList {
private int[] arrs ;
private static final int DEFAULT_CAPACITY = 10;
private int size;//ArrayList中存储元素的个数
private int capacity;//底层arrs数组的长度
public ArrayList() {
this(DEFAULT_CAPACITY);
}
public ArrayList(int capacity) {
arrs = new int[capacity];
this.capacity = capacity;
this.size = 0;
}
/**
* 返回当前ArrayList集合中的元素的个数
* @return
*/
public int size() {
return this.size;
}
/**
* 返回当前ArrayList底层数组的容量
* @return
*/
public int opacity() {
return arrs.length;
}
/**
* 返回当前数组是否为null
* @return
*/
public boolean isEmpty() {
return this.size==0;
}
/**
* 添加元素到指定的位置上
* @param value 添加的元素
* @param index 添加的位置
*/
public void add(int value,int index) {
if(index<0||index>size) {
System.out.println("错误参数:"+index);
return;
}
// 添加元素的时候 size == arrs.length
if(size==arrs.length) {
resize(arrs.length*2);
}
//依次挪动数组中的元素 给待添加的元素腾出来位置
for(int i =size-1;i>=index;i--) {
arrs[i+1] = arrs[i];
}
arrs[index] = value;
//最后做完之后
size++;
}
/**
* 添加首元素
* @param value
*/
public void addFirst(int value) {
add(value,0);
}
/**
* 添加尾元素
* @param value
*/
public void addLast(int value) {
add(value,size);
}
/**
* 查询是否存在指定的元素
* @param value 查询的元素
* @return 元素内容
*/
public boolean contains(int value) {
return getIndexByValue(value)!=-1;
}
/**
* 查询指定元素在当前数组中的索引位置(只找一个)
* @param value
* @return 查找的元素的所有 如果不存在返回-1
*/
public int getIndexByValue(int value) {
for(int i= 0;i<size;i++) {
if(arrs[i]==value) {
return i;
}
}
return -1;
}
/**
* 返回指定索引位置上的元素
* @param index 索引
* @return 元素 如果返回-1 代表当前数组的入参有误
*/
public int get(int index) {
if(index<0||index>=size) {
System.out.println("错误参数:"+index);
return -1;
}
return this.arrs[index];
}
/**
* 修改数组中指定位置上的元素
* @param index 指定的索引
* @param value 修改之后的值
* @return 修改之前的值 如果索引有问题 返回-2
*/
public int set(int index,int value) {
int oldValue = get(index);
if(oldValue!=-1) {
arrs[index]=value;
return oldValue;
}
return -2;
}
/**
* 根据索引删除元素
* @param index 索引
* @return 删除的元素 如果索引有误 返回-1
*/
public int remove(int index) {
if(index<0||index>=size) {
System.out.println("参数有误");
return -1;
}
int ret = arrs[index];
for(int i = index;i<size-1;i++) {
arrs[i] = arrs[i+1];
}
size--;
arrs[size]=0;
if(size==arrs.length/4&&arrs.length/2>0) {
resize(arrs.length/2);
}
return ret;
}
/**
* 删除第一个元素
* @return
*/
public int removeFirst() {
return remove(0);
}
/**
* 删除最后元素
* @return
*/
public int removeLast() {
return remove(size-1);
}
/**
* 数组扩容操作
*/
private void resize(int capacity) {
//有一个新的数组
int[] newArrs = new int[capacity];
// 拷贝
copyOf(arrs, newArrs,Math.min(arrs.length, newArrs.length));
//给引用
arrs = newArrs;
}
/**
* 数组复制
* @param src 源数组
* @param dest 目标数组
*/
private void copyOf(int[] src,int[] dest,int min) {
//判定
if(src==null||dest==null) {
System.out.println("参数有误 数组为null");
return;
}
if(src.length<=0||dest.length<=0) {
System.out.println("参数有误 数组的长度有误");
return;
}
for(int i = 0;i<min;i++) {
dest[i] = src[i];
}
}
/**
* 获取当前ArrayList的内容
*/
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append("size:"+this.size+"opacity:"+this.arrs.length);
sb.append("[");
for(int i = 0;i<size;i++) {
sb.append(arrs[i]);
if(i!=size-1) {
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
}