• 浅谈一下:Java当作数组的几个应用场景


    对于数组,在C语言中就有过学习,但是,并没有怎么进行总结过,所以,笔者在Java中,对数组的几个简单的应用场景进行总结一下:

    1.保存数据

    1. public static void main(String[] args) {
    2. int[] array = {1, 2, 3};
    3. for(int i = 0; i < array.length; ++i){
    4. System.out.println(array[i] + " ");
    5. }
    6. }

    代码的运行结果为:

     2.. 参数传基本数据类型

    1. public static void main(String[] args) {
    2. int num = 0;
    3. func(num);
    4. System.out.println("num = " + num);
    5. }
    6. public static void func(int x) {
    7. x = 10;
    8. System.out.println("x = " + x);
    9. }

     代码的运行结果为:

     发现在func方法中修改形参 x 的值, 不影响实参的 num 值.

    3.. 参数传数组类型(引用数据类型)

    1. public static void main(String[] args) {
    2. int[] arr = {1, 2, 3};
    3. func(arr);
    4. System.out.println("arr[0] = " + arr[0]);
    5. }
    6. public static void func(int[] a) {
    7. a[0] = 10;
    8. System.out.println("a[0] = " + a[0]);
    9. }

     代码的运行结果为:

     发现在func方法内部修改数组的内容, 方法外部的数组内容也发生改变. 因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。

    总结: 所谓的 "引用" 本质上只是存了一个地址. Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实 只是将数组的地址传入到函数形参中. 这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).

    4. 作为函数的返回值

    比如:获取斐波那契数列的前N项

    1. public class Main {
    2. public static int[] fib(int n){
    3. if(n <= 0){
    4. return null;
    5. }
    6. int[] array = new int[n];
    7. array[0] = array[1] = 1;
    8. for(int i = 2; i < n; ++i){
    9. array[i] = array[i-1] + array[i-2];
    10. }
    11. return array;
    12. }
    13. public static void main(String[] args) {
    14. int[] array = fib(10);
    15. for (int i = 0; i < array.length; i++) {
    16. System.out.println(array[i]);
    17. }
    18. }
    19. }

    代码的运行结果为:

     拓展讲解:

    1.作为函数的返回值部分:

    1. public static void func1(int[] array) {
    2. array=new int[]{15,16,17};
    3. }
    4. public static void func2(int[] array) {
    5. array[0]=99;
    6. }
    7. public static void main(String[] args) {
    8. int[] array1={1,2,3,4};
    9. func1(array1); //打印结果: [1,2,3,4]
    10. // func2(array1); //打印结果: [99,2,3,4]
    11. }

    在上述代码中:对func1进行分析:

     形参的改变,不会影响实参!!

    在上述代码中:func1仅仅是改变了形参的指向,并没有影响的实参

    对func2进行分析:

     在func2函数中,传递的是引用,我们可以通过引用来改变原来的值!!

    总结一下:

    当数组作为参数进行传递的时候,其实还是按值传递的,此时的值是一个地址!!那么就会出现两种情况:

    情况1:形参修改指向,array=new int[10];  只会影响形参的指向!

    比如:

    1. public static void func1(int[] array) {
    2. array=new int[]{15,16,17};
    3. }
    4. public static void main(String[] args) {
    5. int[] array1={1,2,3,4};
    6. func1(array1); //打印结果: [1,2,3,4]
    7. }

    情况2:形参修改指向对象的值: array[0]=99,此时才会影响到实参!

    1. public static void func2(int[] array) {
    2. array[0]=99;
    3. }
    4. public static void main(String[] args) {
    5. int[] array1={1,2,3,4};
    6. // func2(array1); //打印结果: [99,2,3,4]
    7. }

    2.数组作为函数的返回值

    1. public static int[] func10() {
    2. int[] tmpArr={11,22,33};
    3. return tmpArr;
    4. }
    5. public static void main(String[] args) {
    6. int[] array=func10();
    7. System.out.println(Arrays.toString(array)); //[11,22,33]
    8. }

    上述代码的运行结果为:

     画图分析为:

     解析:tmpArr 是在函数里面创建的局部变量!当遇见return 的时候,这个方法就结束了,那么tmpArr 就会被回收掉了(销毁),那么,就意味着,tmpArr把值传递给array后,就被回收了!!

    3.方法内部接收数组,并且返回数组!

    1. public static int[] grow(int[] array) {
    2. for (int i = 0; i < array.length; i++) {
    3. array[i]=array[i]*2;
    4. }
    5. return array;
    6. }
    7. public static void main(String[] args) {
    8. int[] array={1,2,3,4,5,6,7,8};
    9. int[] ret=grow(array);
    10. System.out.println(Arrays.toString(array)); //[2, 4, 6, 8, 10, 12, 14, 16]
    11. System.out.println(Arrays.toString(ret)); //[2, 4, 6, 8, 10, 12, 14, 16]
    12. }

    上述代码的运行结果为:

    画图解析一下:

    但是,另外一种写法: 我们需要简单思考一下哟!!

    1. public static int[] grow(int[] array) {
    2. int[] tmpArray =new int[array.length];//java支持这种数组的创建!!里面可以是变量!
    3. for (int i = 0; i < array.length; i++) {
    4. tmpArray[i]=array[i]*2;
    5. }
    6. return tmpArray;
    7. }
    8. public static void main(String[] args) {
    9. int[] array={1,2,3,4,5,6,7,8};
    10. int[] ret=grow(array);
    11. System.out.println(Arrays.toString(array)); //[1, 2, 3, 4, 5, 6, 7, 8]
    12. System.out.println(Arrays.toString(ret)); //[2, 4, 6, 8, 10, 12, 14, 16]
    13. }

    代码的运行结果为:

    画图解析为:

     

  • 相关阅读:
    [C++随笔录] stack && queue模拟实现
    第05章 Pandas 入门
    MQTT介绍和使用
    【算法集训专题攻克篇】第十三篇之双向链表(较难)
    clickhouse简单安装部署
    7-MySQL函数
    iceoryx(冰羚)-通信中间件解析
    1.9 - Cache
    使用ansible剧本批量部署jdk+tomcat+jenkins+nginx,实现访问nginx就能访问到jenkins服务
    Compose 动画艺术探索之 AnimationVector
  • 原文地址:https://blog.csdn.net/weixin_64308540/article/details/127731651