概论
数组是相同数据类型的多个数据的容器。
这些元素按线性顺序排列。所谓线性顺序是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个
元素外,每一个元素都有唯一的后继元素。(“简单理解就是:一个跟一个顺序排列”)。
创建格式
格式 1. 数据类型[] 数组名称 = new 数据类型[数组长度];
格式 2. 数据类型[] 数组名称 = {数组内容 1,数组内容 2,数组内容 3…数组内容 n};
格式 3. 数据类型[] 数组名;
格式 3 属于只创建了数组引用名, 并未在内存创建数组空间。
格式 4. 数据类型[] 数组名称 = new 数据类型[]{内容 1,内容 2,内容 3…内容 n}
下标
可以理解为数组中内容的数字序号,从 0 开始 ,对于长度为 n 的数组,下标的范围是 0~n-1。
可以通过下标的方式访问数组中的每一个元素。
例如: 创建 int 类型数组 arr , 给数组 arr 的 5 下标赋值数据 , 然后打印
int[] arr = new int[10];
arr[5] = 123;
System.out.println(arr[5]);
数组的优点:
存取速度快,查询方便
数组的缺点:
事先必须知道数组的长度
插入删除元以用素很慢
空间通常是有限制的
需要大块连续的内存块
插入删除元素的效率很低
数组的操作
数组的添加
直接赋值给下标数组相对应的值。
//赋值给当前下标元素,进行存储
element[index] = o;
数组指定元素的删除
数组的删除就是通过把删除元素的前后部分分别复制到一个比原先数组长度小1的数组上面。
1.首先判断数组是否越界,没有越界时,先创建一个比原先数组长度小一的新数组,循环数组得到要删除的元素下标,在这个下标之前把原元组内容复制给新数组,在这个下标之后,把原数组的后半部分复制到新数组上。最后把原数组名称赋值给新数组。
//下标移除
public void remove(int index) {
//输入的下标大于数组最大下标
if(index > size-1) {
System.out.println("超出该数组范围");
}else {
//创建一个比原先数组长度小于1的数组,数组移除,长度-1
Object[] newElement = new Object[size-1];
for(int i = 0;i<element.length;i++) {
//循环判断移除的数组是哪一个
if(index == i) {
//在当前下标下,通过下标加1进行覆盖前移
for(int j = i;j < element.length-1;j++) {
newElement[j] = element[j+1];
}
break;
}
//当前下标之前进行复制存储
newElement[i] = element[i];
}
System.out.println("移除成功");
this.element = newElement;
this.size--;
}
}
//数据移除
public void remove(Object o) {
boolean flag = true;
//创建新数组,长度减一
Object[] newElement = new Object[size-1];
for(int i = 0;i<element.length;i++) {
//循环判断当前数据是否有在数组中相同的
if(element[i].equals(o)) {
flag = false;
//循环当前下标之后的数据覆盖前移
for(int j = i;j < element.length-1;j++) {
newElement[j] = element[j+1];
}
break;
}
//把旧的数组当前数据的下标之前的进行复制到新数组中
newElement[i] = element[i];
}
//判断数据是否存在数组中
if(flag) {
System.out.println("数组中找不到该数据");
}else {
System.out.println("移除成功");
this.element = newElement;
this.size--;
}
}
数组的查询遍历
1.指定查询:通过index下标进行查询获取
2.遍历查询:通过for循环,次数为数组的个数,也就是数组.length。
//指定查询
public Object get(int index) {
return element[index];
}
//查询全部
public void getAll(){
for (int i = 0;i<element.length;i++){
System.out.println(element[i]);
System.out.println(element.length);
}
}
数组的扩容操作
无需真正增加原数组的容量。只用将原内容复制到新的大数组,然后让大数组名称重新等于原数组,由于原数组数据在堆中,失去引用会被gc自动回收。
`//动态扩容
private void add(Object o) {
//创建一个比原先数组长度大的新数组
Object[] newElement = new Object[size+1];
//循环,把老数组中的数据循环存储到新数组中
for(int i = 0;i<element.length;i++) {
newElement[i] = element[i];
}
//把原先存不了的存储到新数组中
newElement[size] = o;
System.out.println("添加成功");
//把原数组名重新赋值给新数组
this.element = newElement;
//数组长度自增
this.size++;
}