关于java数组的几个要点

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检测才会回收这个内存空间。所谓的删除操作其实并不是真正的删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值