Java版数据结构基础篇——数组(2)

目录

数组的基本操作

遍历数组

使用for循环遍历数组

使用ArrayList的forEach方法

了解不同数据类型数组的默认值

数组在内存中的划分

这篇文章用到的IDEA的相关快捷键

 总结


数组的基本操作

遍历数组

遍历数组是一种常见的操作,当我们要使用数组来呈现数据时,需要掌握数组的遍历方法。

使用for循环遍历数组

我们使用.length来获取数组的长度,对于下面这个数组,长度即为5。

int[] arr1={1,5,78,61,255};
for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]); 
}

       我们还可以使用另一种方式:使用enhanced for循环。声明数组部分一样。在循环开头声明一个和数组元素类型相同的变量item,这个变量用于接收数组元素。然后就可以在循环中写入我们想要实现的功能代码。

int[] arr2={1,5,78,61,255};
for (int item : arr2) {
  System.out.println(item);
}

使用ArrayList的forEach方法

        这种方式是Java8开始引入的特性,这里仅仅简单介绍,数据结构篇讲到后面我再详细介绍。list是ArrayList的对象,用add方法给数组赋予元素值,并使用forEach方法遍历,这里同样用到了新定义的变量item。

ArrayList<Integer>list=new ArrayList<>();
        list.add(1);
        list.add(5);
        list.add(78);
        list.add(61);
        list.add(255);

        list.forEach(item->{
            System.out.println(item);
        });

了解不同数据类型数组的默认值

这里我们直接用代码测试结果

public class OneArrayTest02 {
    public static void main(String args[]){
        //数组元素的默认初始值
        //整型数组元素的默认值
        int[] arr4=new int[5];
        System.out.println(arr4[4]);
        short[] arr5=new short[4];
        System.out.println(arr5[3]);
        //byte和long其实也是一样的

        //浮点型数组元素的默认值
        float[] arr6=new float[5];
        System.out.println(arr6[4]);
        double[] arr7=new double[5];
        System.out.println(arr7[4]);

        //字符型数组元素的默认值
        char[] arr8=new char[5];
        System.out.println(arr8[4]);

        //布尔类型数组元素的默认值
        boolean[] arr9=new boolean[5];
        System.out.println(arr9[4]);

        //引用数据类型数组元素的默认值
        String[] arr10=new String[5];
        System.out.println(arr10[4]);
    }
}

运行结果如下:


       这里需要强调一点的是char这种类型,char类型的默认值,从数的角度来看,就是数字0,或者也可以表示为\u0000,在Unicode编码的对应关系中,\u0000就对应的是空。

数组在内存中的划分

       首先我们要大致知道JVM整体的架构图,对于我们这里要涉及到的内存区域,我们着重关注虚拟机栈和堆,这两个空间即可。


先看一下这份代码:

public class OneArrayTest03 {
    public static void main(String args[]){
        int[] arr1=new int[4];
        arr1[0]=15;
        arr1[1]=87;
        System.out.println(arr1);

        String[] arr2=new String[3];
        arr2[0]="北京";
        arr2[1]="深圳";
        System.out.println(arr2);
        arr2=new String[2];
        System.out.println(arr2);
    }
}


       这里先简单理解,字符串“北京”,“深圳”就是直接放入这块内存区域的,后续讲到字符串常量池,再对这种情况详细讲解。

       arr2原本定义的是第一个容量为3的String类型,存有首元素的地址,但是随即我们又用arr2为数组名新建了另一个数组,这时候,arr2在栈中就以新的地址存在,即41629346。凡是new了,就在内存中开辟了一个新的空间了。这时候垃圾收集器就会回收原来的那个首地址为3b07d329的数组。也就是说,存有“北京”的数组,没有指针指向它了,也就会被垃圾收集器回收

       而当main函数执行完所有的代码后,main这一内存区域就会被弹出,同时堆空间里面的所有内容也就会被回收,堆和栈中的所有之前为之开辟的空间全部清空。

       这里还要说明一下,目前我们所做的对于数组的操作,以及后面会讲到的集合框架,都是在内存层面的对数据的存储,并不是存在了外设上,比如磁盘。而且我们先主要以一维数组举例,其实真正在开发中,多维数组应用的并不是很多。

再看一份代码

package DataStructures;

public class OneArrayTest04 {
    public static void main(String args[]){
        int[] arr3=new int[3];
        arr3[0]=56;
        arr3[1]=70;
        arr3[2]=93;

        System.out.println(arr3[0]);
        System.out.println(arr3);

        //把arr3这个数组的首地址赋值给arr4
        int[] arr4=arr3;
        arr4[1]=9;
        System.out.println(arr4[1]);
        System.out.println(arr4[2]);
    }
}


 这里我们用了int[] arr4=arr3;这个操作,首先思考一个,这会实现什么?

       首先我们知道,数组名在栈空间内,存有的是首个元素的十六进制地址,而arr3又直接赋值给了arr4,其实意思就是:arr4和arr3两个数组的首地址都是一样的,那么就是它们共同指向了堆空间内的数组空间

       不过这里有个疑问?为什么堆空间内没有两个数组空间呢?首先,既然已经arr4的首地址就是4eec7777,那就肯定是指向的一个唯一固定的内存空间,并且从代码的角度也能看出来,我们这里没有用new,也就不会为这个数组变量为之开辟一个新的内存空间了

这篇文章用到的IDEA的相关快捷键

arr4.sout+回车键,就是打印语句
fori加回车键就会生成for循环的模板

 

 总结

       全文介绍了数组的一些基本操作,如何简单的使用数组,并且从内存的角度,讲解了一下数组的生命周期,首地址到底存在哪?代表什么的问题。内容比较基础,适合于初学者快速掌握。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值