1、java数组一旦被创建,开辟的内存大小就被固定。看到很多博文都出现“数组扩容”的说法,简直就是瞎鸡巴扯淡;
2、List不是数组,是链表。看到很多博文在“删除数组元素”下面添加List方法。方法没错,但那是封装后的方法,把List和数组划等号简直就是误人子弟,我都怀疑那些人到底有没有弄明白数组和链表的区别。
3、数组删除元素本质上是通过建立新数组,开辟新的存储空间,把原来数组的元素复制过去来实现的。比如有数组[1, 2, 3, 4]要删除第二个元素,基本做法就是:
package test;
public class DelArrayItem{
int[] a;
int[] b;
int count;
DelArrayItem(){
a = new int[]{1, 2, 3, 4};
count = a.length;
}
void returnArray(int index){
for(int i = index; i < count; i++){
/*下标为index-1*/
a[i-1] = a[i];
}
/*a数组结果为[1,3,4,4],因为数组大小无法改变,所以最后一个元素不会变化*/
}
@SuppressWarnings("unused")
void getResult(){
int[] c = a;
int[] b = new int[count-1];
/*注:不要直接使用b = a;这样仅仅是把a数组的引用复制到b数组中,两个数组实际还是使用同一个内存空间*/
for(int n = 0; n < count-1; n++){
b[n] = c[n];
}
System.out.println("原数组的结果为:");
for(int old : c){
System.out.print(old+" ");
}
System.out.println("--------------------------");
System.out.println("数组的结果为:");
for(int num : b){
System.out.print(num+" ");
}
System.out.println("--------------------------");
a[0]=90;
if(c != null){
System.out.println("a数组改变后,数组c的结果为:");
for(int old : c){
System.out.print(old+" ");
}
}else{
System.out.println("c数组为空!");
}
}
public static void main(String[] args){
DelArrayItem del = new DelArrayItem();
del.returnArray(2);
del.getResult();
}
}
输出结果:
可以看到,a数组和c数组是共用一块内存,当a数组元素改变时,c数组的元素也随之改变。但是,a数组和c数组虽然共用同一块内存空间,实际上是两个不同的引用地址,即便a=null,c数组仍旧可以遍历出元素,因为a=null仅仅是把自己的引用地址设为空,并没有对清空内存空间,对c数组的使用没有影响。
在很多博文里面,其实都没有对原数组进行清空预回收操作,即没有把数组设为null。所以实际上即便进行了所谓的删除操作,原数组占用的内存空间仍旧是存在的,只有等下一次GC检测才会回收这个内存空间。所谓的删除操作其实并不是真正的删除。