Java数据结构与算法(二)数组
数组定义
在Java中,存储相同类型的一块(定长)连续内存空间。
特点:类型相同、连续空间、定长
延伸的一些特点:可重复、默认值为类型的默认值
数组的声明
int[] aa = new int[29];
int[] bb = new int[] {1,2,3};
String[] str = {"aaa","bbb","ccc","ddd"};
数组操作
成员变量
private Object[] elements = null;
private int size = 0;//已经添加到的位置
构造方法
public ArrayGo(int defaultCapacity) {
elements = new Object[defaultCapacity];
}
添加数据
添加到最后
public int add(Object obj) {
if(size == elements.length) {
System.out.println("数组已经满了");
return -1;
}
elements[addIndex++] = obj;
return addIndex;
}
包含操作
返回第一匹配的数组下标
public int contains(Object obj) {
if(obj == null) {
throw new IllegalArgumentException("参数不能为空");
}
for(int i = 0;i<elements.length;i++) {
if(elements[i].equals(obj)) {
return i;
}
}
return -1;
}
删除操作
public Object delete(int index) {
if(index > size || index <0) {
return -1;
}
Object result = elements[index];
//我们就不用Arrays.copy了
for(int i=index;i<size-1;i++) {
elements[i] = elements[++i];//往前挪
}
elements[--size] = null;//最后一个元素设置为空
return result;
}
数组倒置练手
public static void revise(int [] array) {
if(array == null || array.length == 0) {
return ;
}
System.out.print("before revise=");
for(int k=0;k<array.length;k++) {
System.out.print(array[k]+",");
}
System.out.println("------------");
int i = 0;
int j = array.length-1;
while(i<j) {
int tmp = array[j];
array[j] = array[i];
array[i] = tmp;
i++;
j--;
}
System.out.print("after revise=");
for(int k=0;k<array.length;k++) {
System.out.print(array[k]+",");
}
}
拓展
我们稍加改动就能做成循环队列,可以考虑下如何实现。
就是在addIndex和takeIndex固定数组的长度就可以试下哈!!
总结:
1)数组没有方法,就是一块连续的定容的内存空间,不能自动扩容,我们可以使用ArrayList来替代它
2)按照下标的查询
速度回很快,
3)按照对象是否存
查询需要遍历整个数组,数据很大的时候查询速度不如hash快
4)对于删除操作需要将对删除后小标的数据往前移动,将最后一个置为空如果是delete(0)需要移动几乎真个数组的数据
简易版的就是这样子,没有扩容,没有考虑线程安全等等。