当前位置:主页 > 查看内容

java第三话:从数组来了解java中的引用和java中的传址操作

发布时间:2021-08-07 00:00| 位朋友查看

简介:从数组来真正开始了解java与C的区别 数组 java中如何创建数组 如何访问和修改数组 foreach循环 如何在java中进行传址操作 引用 new关键字 传引用 上一话中我们谈到了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传址操作有了一定了解了,至于更多有关数组的知识,我会在之后的博文中更新,希望这篇文章对你有所帮助。

                                                                                                    感谢观看,如有错误,欢迎指正。
;原文链接:https://blog.csdn.net/weixin_51306225/article/details/115863239
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文


随机推荐