Array动态数组设计
在平时日常的撸代码中,我们比较常用的数据结构就是数组了吧(经常用这个数据结构进行测试),今天我们就一起来探讨一下关于数组的实现是怎么一回事。
首先我们先想一下关于动态数组的话应该设计一些哪些内容
属性部分:
1、数组的数量
private int size;
2、用来的存放数据容器
private <E>[] element;
3、数组的初始化容量
public static final int DEFAULT_CAPACITY = 10;
4、出现异常或者没有元素的返回情况
public static final int ELEMENT_NOT_FOUND = -1;//在这里我们记作-1
方法部分:
1、构造方法
public ArrayTest()
{
this(DEFAULT_CAPACITY);//默认给定容量为10的数组
}
public ArrayTest(int capacity)//此处有参构造中的数据是为了给用户提供想要输入的数组大小
{
//若用户给定的数据大于初始值(10)我们返回用户输入的值,不超过则按默认值(10)进行初始化
capacity = (capacity > DEFAULT_CAPACITY)? capacity : DEFAULT_CAPACITY;
elements = new Object[capacity];//给容器进行初始化
}
2、查询数组数量
public int size()
{
return size;
}
3、查看元素中是否为空
public boolean isEmpty()
{
return size == 0;
}
4、查询数组是否存在某个元素
public boolean contains(E element)
{
return indexOf(element) != ELEMENT_NOT_FOUND;
}
5、获取元素的内容
public E get(int index){
return elements[index];
}
6、修改元素内容
public E set(int index,E element){
E old = elements[index];//最初值地址传给变量
elements[index] = element;//把需要修改的值赋值给要修改的位置
return old;//返回
}
7、数组下标越界问题(著名异常)
private void rangeCheck(int index)
{
if(index < 0 || index > size){
outOfBounds();//创建异常对象的方法
}
}
8、异常创建
private void outOfBounds()
{
throw new IndexOutOfBoundsException("Array subscript out of bounds");//创建异常并打印异常信息
}
9、数组扩容
private void ensureCapacity(int capacity)
{
int oldcapacity = elements.length;//获取当前的长度/容量
if(oldcapacity > capacity){//若数组容量大于输入的capacity,则直接返回
return;
}
int newCapacity = oldcapacity + (oldcapacity/2);//扩容为原来的1.5倍
E[] newElements = (E []) new Object[newCapacity];//新数组容量传给变量
for(int i = 0;i < size;i++)
{
newElements[i] = elements[i];//数据拷贝到新的数组当中
}
elements = newElements;
}
10、添加元素
public void add(int index,E element)
{
rangeCheckAdd(index);//数组范围检查
ensureCapacity(size + 1);//向后移动一位,是否需要扩容
for(int i = size; i > index ;i--){
elements[i] = elements[i-1];//满足条件 元素后移
}
elements[index] = element;//元素赋值到指定位置
size++;//容量增加
}
11、数组缩容(数据存储< 空间容量)
private void trimTosize()
{
int oldCapacity = elements.length;
int newCapacity = oldCapacity/2;
if(size >= (newCapacity) || oldCapacity <= DEFAULT_CAPACITY)
//size容量大于原容量的一半时,或者原容量小于10
{
return;
}
E[] newElement = (E[])new Object[newCapacity];//创建新的数组,容量为原来的一般
for(int i = 0;i < size;i++){
newElement[i] = elements[i];//遍历赋值
}
elements = newElement;
}
12、数组删除
public E remove(int index)
{
rangeCheck(index);//属性检查
trimTosize();//是否需要缩容
E old = elements[index];
for(int i = index;i<size;i++)
{
elements[index] = elements[index + 1];
}
elements[--size] = null;
return old;
}
13、查询元素位置
public void indexOf(E element)
{
if(element == null)//判断是否为空
{
for(int i = 0;i<size;i++){
if(element[i] == 0){//数据是否为空
return i;
}
}
}else{//不为空的情况
for(int i = 0;i<size;i++){
if(eleement.equals(elements[i]))//对比地址是否相同
{
return i;
}
}
}
return ELEMENT_NOT_FOUND;//能到这里说明不上上述两类情况
}