动态数组基本操作
通常我们创建一个数组便会对其初始化,使其容量为定值。对于应用中的某些问题,例如:添加未知数个对象...到某一容器中,这时候容量不变的数组(当然你也可以选择单列或双列集合)可能满足不了我们的需求。那么我们怎么将一个数组的容量变成动态的呢??下面我们来写一些方法使其成为你想让它成为的样子。
1、插入/添加元素
package suanfa;
public class Dongtaishuzu {
int size;
int element;//添加的元素
int array[]=new int[size];
//插入、添加
public void addist(int elemennt) {
add(size,element);
}
private void add(int index, int element) {
// TODO Auto-generated method stub
if(index>=0&&index<size) {
System.arraycopy(array,index,array,index+1,size-index);
}
array[index]=element;
size++;
}
}
注:再添加元素方法中,我们使用了一个Java方法:System.arraycopy(源数组,源数组的实际拷贝位置(即添加的位置),目标数组,目标数组的实际拷贝位置,拷贝长度),我们使用这个方法可以很好地将数组扩容。
同理:删除操作也使用arraycopy方法:
2、删除元素
//删除
public int remove(int index) {
int removed=array[index];//想要在原数组中删除的元素
System.arraycopy(array,index+1,array,index,size-index-1);
size--;
return removed;
}
代码解读:
index+1为想要删除的元素的索引位置;拷贝的长度为size-index-1。自己可以举一个实际例子会更好理解。
3、扩容
//扩容
int capacity;//想要扩大的容量
public void addd(int index,int element) {
if(size==capacity) {
capacity+=capacity>>1;
int []newArray=new int[capacity];
System.arraycopy(array,0,newArray,0,size);
}
}
代码解读:
上述代码中的当size==ccapacity其情况:其capacity容量可以自定义。
4、遍历
①函数式接口consumer遍历(其本质为for循环演变为增强for)
代码演示:
//遍历
public void forEach(Consumer<T>consumer) {
for(int i=0;i<size;i++) {
consumer.accept(array[i]);
}
}
注意:
①使用函数式接口前需要导包:import java.util.function.Consumer;
②“T”为泛型:它是根据你所定义的数组的数据类型来判定的。(类似于集合中的泛型)
②迭代器遍历
public Iterator<T>iterator(){
return new Iterator<T>() {
public boolean hasNext() {
return false;
}
public T next() {
return null;
}
}
注意:
①在使用迭代器遍历时需要导包:import java.util.Iterator;
②使用前要先获取迭代器对象:Iterator<T>iterator=数组名/集合名 . iterator(创建指针,默认指向0索引)
③hasNext()是判断当前位置是否有元素;next()是获取当前位置的元素,将迭代器对象传下一位。
详细代码:
public boolean hasNext() {
return false;
}
public T next() {
while(ie.hasNext()) {
String str=it.next();
System.out.println(str);
}
}
④迭代器遍历完,它不会复位。要想第二次遍历,只能再次获取新的迭代器对象。
拓展
对于在动态数组中添加或删除性能:
头部位置:时间复杂度为:O(n)
尾部位置:时间复杂度为:O(1)
中部位置:时间复杂度为:O(n)
下一次我们将详细介绍单列和双列集合以及泛型................