看到这句话的时候证明:此刻你我都在努力
加油陌生人
数组
数组是一推相同数据类型组合在一起的集合,数组是引用类型数据,比如int[10] arr; 就是一个储存着10个int类型的一个集合,这就是数组。
那么数组有什么用呢?它存在的意义是什么呢?
在我看来数组的作用就像我们生活中用来装各种种类的盒子,比如有些盒子是装一些笔,有些是装一些书,有些是在装一些化妆品等等,他们的作用无非就是让我们使用时更加方便,不会因为分散而到处去找。数组也是一样的作用,极大减少了我们程序员对数据寻找去使用的时间。为我们更好的储存数据。比如:我们的通讯录也是运用数组来完成的。
一维数组
一维数组是数组中比较简单的数组,那么他和C语言的数组一样吗?今天我们就对标一下C语言中的数组,来探索一下Java中的数组与C语言中的数组有何不同?
我们可以看一下下面这一段代码:
public static void main(String[] args) { int[] arr1={1,2,3,45}; int[] arr2=new int[]{1,2,3,45,6}; int[] arr3=new int[10]; System.out.println(arr1); System.out.println(arr2); System.out.println(arr3); }
首先我们看一下上面的三种一维数组的定义方法,其中第一第二种其实可以说是同一种,这两种方法就是在定义数组的同时给数组进行初始化,大家也看到第二种比第一种的写法较为繁杂,但效果都是一样的,所以我们建议如果直接给数据初始化的话我们用第一种定义方法即可。
然后就是第三种方法就是定义一个元素长度为10的数组。与C语言不同在C语言中如果要定义一个元素长度为10的整形数组的代码是:int arr[10];
讲解完定义方法我们可以在思考一下接下来的打印结果:会不会打印数组出来呢?
然后下面是输出的结果:
很显然从打印结果来看,编译器并没有把数组打印出来,而是打印出了一串数字,符号和字母的组合,那么这是什么呢?这时候我就又要把C语言扯出来说事了。
其实这就类似C语言中的数组的地址,可能有小伙伴就比较疑惑了,不是说Java中没有地址吗?
emmm,按我的理解的话,Java并非没有地址,而是不运用地址,Java中是没有对数据地址操作的相关操作,也就是不用地址对程序进行处理。
那么我们该如何打印出来呢?
第一种方法:对数组的每个成员元素进行遍历打印。arr1.length可以得到数组的长度
如下:
public static void main(String[] args) { int[] arr1={1,2,3,45}; int[] arr2=new int[]{1,2,3,45,6}; int[] arr3=new int[10]; System.out.println(arr1); System.out.println(arr2); System.out.println(arr3); for (int i = 0; i <arr1.length ; i++) { System.out.print(arr1[i]+" "); } System.out.println(); for (int i = 0; i <arr2.length ; i++) { System.out.print(arr2[i]+" "); } System.out.println(); for (int i = 0; i <arr3.length ; i++) { System.out.print(arr3[i]+" "); } System.out.println(); }
需要注意的是arr3我们是对它定义的方法没有给它赋初值,所以默认数组里面的值全为0
第二种方法:利用我们Java中现成包的输出方法——将数组转化为字符串进行输出。
如下:
public static void main(String[] args) { int[] arr1={1,2,3,45}; int[] arr2=new int[]{1,2,3,45,6}; int[] arr3=new int[10]; System.out.println(arr1); System.out.println(arr2); System.out.println(arr3); System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); }
Java中数组是引用类型
首先我们要说Java中数组与C语言数组有什么区别,那么这里就要谈到引用。
对标一下C语言数组的区别Java中的数组有什么不同呢?
- Java中数组是可以做为返回类型的
public static int[] func1(){ int[] arr={1,2,3,4,5,6}; for (int i = 0; i <arr.length ; i++) { arr[i]*=2; } return arr; } public static void main(String[] args) { System.out.println(Arrays.toString(func1())); }
- Java中的数组是储存的元素是存放在堆区上,而数组名存放在栈区指向堆区的那块储存元素的地址,在Java中叫做引用。
三、局部数组变量本身在方法结束时,变量本身是会被销毁的,但数组本身的元素可能还是会存在于内存中。如果数组中的元素是对象,且对象没有被其它引用所引用,那么它就会可能会被Java内部的垃圾回收器回收,可理解为C语言中的free函数。
扩展:引用类型可以是null,他表示空引用。 基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值; 而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
数组的一些方法使用
一、转化为字符串
public static void main(String[] args) { int[] arr={1,23,4,5,6}; String a=Arrays.toString(arr); System.out.println(a); }
二、数组的拷贝方法
public static void main(String[] args) { int[] arr1={1,2,3,45,}; int[] arr2=Arrays.copyOf(arr1,arr1.length); System.out.println(Arrays.toString(arr2)); //注意这里arr1与arr2不是同一个数组 // 这里copyOf创建出了一个新的数组 }
三、数组的排序方法
public static void main(String[] args) { int[] arr={21,12,4,7,33,98,56,1}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }
二维数组
二维数组与一维数组有什么区别呢?
在我看来二维数组就是一个比较长的一维数组,他是几个一维数组的拼接。实际上在内存中二维数组就是一维数组似的一整块,只不过给这个二维数组在一些地方分割了。
相信我这么讲是比较抽象的,下面我就用一些代码和图解让大家更好理解我上面的话:
上图中我用了arr[2][3]举例画出了,两种二维数组的储存图,那么为了加深记忆我接下来会给大家再次举几个代码的例子:
public static void main(String[] args) { int[][] arr1={{1,2,3,4},{12,4,6,8}}; int[][] arr2=new int[2][3]; int[][] arr3=new int[2][]; //不规则二维数组 System.out.println(Arrays.toString(arr1)); System.out.println(Arrays.toString(arr2)); System.out.println(Arrays.toString(arr3)); } }
如上代码:可能大家伙又感到奇怪了,怎么好像有打印出地址了?还有第三种arr3的定义方式是怎么回事?
其实我们只需要牢记:二维数组就是由几个一维数组拼接而成。那么这里打印的就是那三个二维数组里的6个一维数组的地址了。
当然我们发现arr3的顶义方式是与C语言截然不同的,Java中可以省略列,不能省略行,而C语言则相反。
而且打印出来时两个空引用,这说明了这个二维数组的拼接的那两个二维数组还没有引用到堆区的一块数组。所以我们叫他”不规则二维数组“。
那么该如何正确打印二维数组呢?
两种方法:
第一种方法:将二维数组拆分为一维数组,在用一维数组的打印方法打印出来,二位数组中arr.length就是求二维数组中的行,也就是有几个一维数组。
public static void main(String[] args) { int[][] arr1={{1,2,3,4},{12,4,6,8}}; int[][] arr2=new int[2][3]; int[][] arr3=new int[2][]; //不规则二维数组 for (int i = 0; i <arr1.length ; i++) { System.out.println(Arrays.toString(arr1[i])); } System.out.println("-----------------------"); for (int i = 0; i <arr2.length ; i++) { System.out.println(Arrays.toString(arr2[i])); }
第二种方法:还是用现成包的方法转化为字符串进行输出。
public static void main(String[] args) { int[][] arr1={{1,2,3,4},{12,4,6,8}}; int[][] arr2=new int[2][3]; System.out.println(Arrays.deepToString(arr1)); System.out.println(Arrays.deepToString(arr2)); }
从开始讲二维数组,到现在,其实可以得到一个总结:在Java中已经把二维数组是由一维数组拼接而成这句话给表现得淋漓尽致。
好了这次数组的知识就到这里了。喜欢的话就点个赞吧。