动态数组的Java实现思路:

底层用一个固定长度的数组element来保存数据,每插入一个元素之前先判断一下size+1是否大于底层数组element的长度,如果大于,那么将生成一个大于原来数组长度两倍的数组,然后将原有数据全部拷贝到扩容后的数组中。删除元素的时候也要将所有在删除元素后面的元素全部往前移。

具体实现:(有一些方法是和源码一样的)

importjava.util.Arrays;

publicclassMyArrayList {

//默认初始化长度为16

privatefinalintDEFAULT_SIZE= 10;

//保存数组的长度

privateintcapacity;

//保存底层数组元素的个数

privateintsize= 0;

//用于存储数据的数组

privateObject[]element;

/***

* 以默认数组长度初始化Object数组

*/

publicMyArrayList(){

capacity=DEFAULT_SIZE;

element=newObject[DEFAULT_SIZE];

}

/***

* 以指定长度初始化Object数组

*/

publicMyArrayList(intinitSize) {

if(initSize>0) {

element=newObject[initSize];

}elseif(initSize==0) {

element=newObject[0];

}

else{

thrownewIllegalArgumentException("初始化数组长度异常: "+initSize);

}

}

/***

*返回底层数组长度

*/

publicintlength(){

returnsize;

}

/***

*如果底层数组长度为0返回true,否则返回false

*/

publicbooleanisEmpty() {

returnsize== 0;

}

/***

*

*指定位置index的数据

*返回指定位置的元素

*/

@SuppressWarnings("unchecked")

public T get(intindex){

if(index<0||index>size-1) {

thrownewIndexOutOfBoundsException("数组下标越界...");

}

return(T)element[index];

}

/***

* 获取元素的下标

*@paramobj

*@return返回元素的下标

*/

publicintindexOf(Objectobj){

//为什么要区别判断null与非null,因为null不能使用equals判断,会抛出NullPointerException

if(obj==null){

for(inti= 0;i

if(element[i]==null)

returni;

}else{

for(inti= 0;i

if(obj.equals(element[i]))

returni;

}

return-1;

}

/***

* 向指定位置插入元素

*@paramindex 指定位置

*@parame 指定元素

*/

publicvoidadd(intindex,Ee){

if(index<0||index>size-1) {

thrownewIndexOutOfBoundsException("数组下标越界...");

}

//判断数组是否到达最大容量

ensureCapacity(size+1);

//将index之后的所有元素向后移动一格

System.arraycopy(element,index,element,index+ 1,size-index);

element[index] =e;

size++;

}

publicvoidadd(Ee){

//判断数组是否到达最大容量

ensureCapacity(size+1);

element[size++] =e;

}

/***

* 扩充数组方法,如果当前数组已大最大容量则将数组容量扩充为原来的两倍

*@paramminCapacity

*/

privatevoidensureCapacity(intminCapacity){

if(minCapacity>capacity){

while(minCapacity>capacity){

capacity<<=1;

}

element= Arrays.copyOf(element,capacity);

}

}

/***

* 删除指定下标元素

*@paramindex 指定下标

*@returnoldValue 返回删除元素

*/

publicE remove(intindex){

if(index<0||index>size-1) {

thrownewIndexOutOfBoundsException("数组下标越界...");

}

//保存一下要删除的元素

EoldValue=(E)element[index];

//计算删除该元素后需要往前移动的元素的个数

intnumMoved=size-index- 1;

if(numMoved> 0)

System.arraycopy(element,index+1,element,index,numMoved);

element[--size] =null;

returnoldValue;

}

/***

* 删除最后一个元素

*@return

*/

publicE remove(){

returnremove(size-1);

}

/***

* 清除element数组,并将size置零

*/

publicvoidclear(){

Arrays.fill(element,null);

size= 0;

}

/***

* 循环遍历数组,返回数组所有元素的字符串表示

*/

publicString toString(){

if(size==0) {

return"[]";

}

else{

StringBuffersb=newStringBuffer("[");

for(inti= 0;i

sb.append(element[i].toString()+",");

}

intlen=sb.length();

//在返回之前把最后多加进去的一个    , 号删除

returnsb.delete(len-1,len).append("]").toString();

}

}

}

测试一下:

java 动态数组 输入 java如何实现动态数组_java动态数组