从数组来真正开始了解java与C的区别
上一话中,我们谈到了java中的数据类型和操作符,我们有一种感觉,就是和C感觉没有很大差别
那么从这篇博文中,我们就可以真正了解一些不一样的东西
首先,让我们来了解一下数组吧!
数组
java中如何创建数组
那么什么是数组呢?即储存相同元素的集合
在java中,我们可以有如下定义数组的方式
int[] arr1 = {1,2,3,4,5,6,7,8,9};
int[] arr2 = new int[]{1,2,3,4,5,6,7,8,9,10};
int[] arr3 = new int[20];
System.out.println(Arrays.toString(arr1));
System.out.println(Arrays.toString(arr2));
System.out.println(Arrays.toString(arr3));
//输出结果:
//[1, 2, 3, 4, 5, 6, 7, 8, 9]
//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
//[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
如何访问和修改数组
既然知道了如何创建数组,我们再来了解一下如何对数组进行访问和修改
同C语言一样,java中的数组可以用’[ ]'来对数组进行访问,如下面代码
int[] arr = new int[50];//数组名.length可以获取数组的长度
for (int i = 0; i < arr.length; i++) {
arr[i] = i+1;
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
//输出结果:
//1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 // 44 45 46 47 48 49 50
foreach循环
java中还有一个特别的遍历方式就是foreach循环
int[] arr = {1,2,3,4,5,6,7,8,9,10};
for (int x:arr) {//格式 临时变量:数组名
System.out.print(x+" ");
}
//输出结果:
//1 2 3 4 5 6 7 8 9 10
foreach的代码意思是每次循环的时候会定义一个临时变量x(或者其他),同时将数组的元素拷贝在x上,然后对x进行操作。(所以无法用foreach对数组进行赋值,只能读取数组的值)
如何在java中进行传址操作
引用
我们知道如果在一个方法(或者函数中)想要交换传进来的两个值,如果只进行传值操作是无法完成两个数的交换的,如下图代码
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a);
System.out.println(b);
swap(a,b);
System.out.println(a);
System.out.println(b);
}
public static void swap(int a,int b){
int tmp = a;
a = b;
b=tmp;
}
//输出结果:
//10
//20
//10
//20
当然,在C语言中我们可以使用&来获取地址从而进行传址操作来解决这个问题,那么在java中如何解决这种问题呢?
那就是传引用
何为引用?
在这里我们就要回想到java的数据类型,在上文中我们说过,java有八大基本数据类型还有引用类型,如下图
谈到引用类型,我们不可避免的要说到new这个关键字
new关键字
new可以简单理解为创建对象的关键字,也可理解为在堆区开辟内存的关键字,如下图代码
public static void main(String[] args) {
int[] arr = new int[10];
}
接下来让我们来分析一下这段代码有什么具体含义,我们用下图来做为讲解
当函数运行到main函数的时候,会在栈区为main函数开辟一块栈帧(也就是内存块),然后,我们创建了一个名叫arr的数组。
使用new关键字在堆区开辟了一块内存区域,用来存储新创建的对象。
这时,数组名就存储在栈帧中,这个数组名就叫做引用,那么存储的是啥呢?是数组在堆区中所存放的地址。
(这里我们假设数组在堆区的地址是0x555,那么arr这个引用存储的也就是0x555)
在这,我们和C语言做个小对比,我们知道,C语言只有用内存开辟函数如malloc calloc realloc 才能在堆区中开辟空间。
而在java里面,我们使用new 就可以在堆区中开辟空间。
我们可以做一个小实验来证明引用中存的是否是地址,具体看下图代码
public static void main(String[] args) {
int[] arr1 = {1,2,3,4,5,6,7,8,9};
int[] arr2 = new int[]{1,2,3,4,5,6,7,8,9,10};
int[] arr3 = new int[20];
System.out.println(arr1);
System.out.println(arr2);
System.out.println(arr3);
}
//输出结果:
//[I@1b6d3586
//[I@4554617c
//[I@74a14482
可见,数组名存的是地址,但是,虽然是地址,但java中并没有指针,因此也就没有了很多像C一样对指针的操作。
由此,我们受到启发,java中引用类型的引用存的是地址,是所对应的对象的地址
传引用
回到我们交换两个数的问题,我们就可以通过传数组来解决
public static void main(String[] args) {
int[] arr = {10,20};
System.out.println(arr[0]);
System.out.println(arr[1]);
swap(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
}
public static void swap(int[] arr){
int tmp = arr[0];
arr[0] = arr[1];
arr[1]=tmp;
}
//输出结果:
//10
//20
//20
//10
为啥传引用可以解决这个问题呢?因为引用里面存的是地址,我们对引用进行操作,相当于直接在堆区里面操作数组,所以,直接修改的就是数组本身,也就达到了我们的效果。
最后,我们来做一个小总结
java中的引用是什么?是一个地址。
java中如何进行传址操作? 通过传引用。
(具体理解栈区和堆区里,引用和对象的关系很重要)
到这,我相信你已经对java的引用和java传址操作有了一定了解了,至于更多有关数组的知识,我会在之后的博文中更新,希望这篇文章对你有所帮助。
感谢观看,如有错误,欢迎指正。