首页 > 编程语言 > 详细

到头来还是逃不过Java - 数组操作

时间:2020-02-02 10:01:52      阅读:69      评论:0      收藏:0      [点我收藏+]

数组操作

没有特殊说明,我的这个系列的Java13的学习笔记都是从廖老师那里摘抄、总结过来的,侵删。

技术分享图片

引言

兜兜转转到了大四,学过了C,C++,C#,Java,Python,学一门丢一门,到了最后还是要把Java捡起来。所以奉劝大家,面向对象还是要掌握一门,虽然Python好写舒服,但是毕竟不能完全面向对象,也没有那么多的应用场景,所以,奉劝看到本文的各位,还是提前学好C#或者Java,话不多说,直接开干!

遍历数组

  • for each循环中for (int n : ns),变量n直接拿到ns数组的元素,而不是索引。
  • 显然for each循环更加简洁。但是,for each循环无法拿到数组的索引,因此,到底用哪一种for循环,取决于我们的需要。

打印数组内容

  • 直接打印数组变量,得到的是数组在jvm中的引用地址(数组的首元素的地址)。

  • 使用for each循环打印也很麻烦。幸好Java标准库提供了Arrays.toString(),可以快速打印数组内容

  •   import java.util.Arrays;//注意引入java.util(工具包).Arrays(数组相关工具)
    
      public class Main {
          public static void main(String[] args) {
              int[] ns = { 1, 1, 2, 3, 5, 8 };
              System.out.println(Arrays.toString(ns));//为什么引用方法toString()的时候需要添加Arrays呢?因为要和默认的包作用域区分开来(自圆其说型=_=)
          }
      }

数组排序

  • 常用的有冒泡排序,快速排序,插入排序

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            int[] ns = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
            // 排序前:
            System.out.println(Arrays.toString(ns));
            for (int i = 0; i < ns.length - 1; i++) {
            // n个数字只需要调换n-1轮
                for (int j = 0; j < ns.length - i - 1; j++) {
                // 在对第i个数字只需要调换length-i-1轮次
                    if (ns[j] > ns[j+1]) {
                        // 交换ns[j]和ns[j+1]:
                        int tmp = ns[j];
                        // 注意这里借助了临时变量 tmp
                        ns[j] = ns[j+1];
                        ns[j+1] = tmp;
                    }
                }
            }
            // 排序后:
            System.out.println(Arrays.toString(ns));
        }
    }
  • 实际上,Java的标准库已经内置了排序功能,我们只需要调用JDK提供的Arrays.sort()就可以排序:

    • 对数组排序实际上修改了数组本身

    • 即变量ns本身的数组内容被改变,不是新创建了一个变量,也没有改变ns的指向,但是改变了数组内部的指向。

    •       ┌──────────────────────────────────┐
                       ┌───┼──────────────────────┐           │
                       │   │                      ▼           ▼
                 ┌───┬─┴─┬─┴─┬───┬────────┬───┬───────┬───┬──────┬───┐
        ns ─────>│???│???│???│   │"banana"│   │"apple"│   │"pear"│   │
                 └─┬─┴───┴───┴───┴────────┴───┴───────┴───┴──────┴───┘
                   │                 ▲
                   └─────────────────┘

      调用Arrays.sort(ns);排序后,这个数组在内存中表示如下:

                         ┌──────────────────────────────────┐
                     ┌───┼──────────┐                       │
                     │   │          ▼                       ▼
               ┌───┬─┴─┬─┴─┬───┬────────┬───┬───────┬───┬──────┬───┐
      ns ─────>│???│???│???│   │"banana"│   │"apple"│   │"pear"│   │
               └─┬─┴───┴───┴───┴────────┴───┴───────┴───┴──────┴───┘
                 │                              ▲
                 └──────────────────────────────┘

      原来的3个字符串在内存中均没有任何变化,但是ns数组的每个元素指向变化了。

多维数组

  • 二维数组

  •   // 定义一个二维数组
      public class Main {
          public static void main(String[] args) {
              int[][] ns = {
                  { 1, 2, 3, 4 },
                  { 5, 6, 7, 8 },
                  { 9, 10, 11, 12 }
              };
              System.out.println(ns.length); // 3
          }
      }
  • 因为ns包含3个数组,因此,ns.length3。实际上ns在内存中的结构如下:

                        ┌───┬───┬───┬───┐
             ┌───┐  ┌──>│ 1 │ 2 │ 3 │ 4 │
    ns ─────>│???│──┘   └───┴───┴───┴───┘
             ├───┤      ┌───┬───┬───┬───┐
             │???│─────>│ 5 │ 6 │ 7 │ 8 │
             ├───┤      └───┴───┴───┴───┘
             │???│──┐   ┌───┬───┬───┬───┐
             └───┘  └──>│ 9 │10 │11 │12 │
                        └───┴───┴───┴───┘
  • 如果我们定义一个普通数组arr0,然后把ns[0]赋值给它,实际上arr0就获取了ns数组的第0个元素。因为ns数组的每个元素也是一个数组,因此,arr0指向的数组就是{ 1, 2, 3, 4 }。在内存中,结构如下:

                arr0 ─────┐
                          ▼
                        ┌───┬───┬───┬───┐
             ┌───┐  ┌──>│ 1 │ 2 │ 3 │ 4 │
    ns ─────>│???│──┘   └───┴───┴───┴───┘
             ├───┤      ┌───┬───┬───┬───┐
             │???│─────>│ 5 │ 6 │ 7 │ 8 │
             ├───┤      └───┴───┴───┴───┘
             │???│──┐   ┌───┬───┬───┬───┐
             └───┘  └──>│ 9 │10 │11 │12 │
                        └───┴───┴───┴───┘
  • 二维数组的每个数组元素的长度并不要求相同

  • 要打印一个二维数组,可以使用两层嵌套的for循环:

    for (int[] arr : ns) {
        for (int n : arr) {
            System.out.print(n);
            System.out.print(', ');
        }
        System.out.println();
    }
  • 或者使用Java标准库的Arrays.deepToString()

  • 三维数组

    三维数组就是二维数组的数组。可以这么定义一个三维数组:

    int[][][] ns = {
        {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        },
        {
            {10, 11},
            {12, 13}
        },
        {
            {14, 15, 16},
            {17, 18}
        }
    };

    它在内存中的结构如下:

                                  ┌───┬───┬───┐
                       ┌───┐  ┌──>│ 1 │ 2 │ 3 │
                   ┌──>│???│──┘   └───┴───┴───┘
                   │   ├───┤      ┌───┬───┬───┐
                   │   │???│─────>│ 4 │ 5 │ 6 │
                   │   ├───┤      └───┴───┴───┘
                   │   │???│──┐   ┌───┬───┬───┐
            ┌───┐  │   └───┘  └──>│ 7 │ 8 │ 9 │
    ns ────>│???│──┘              └───┴───┴───┘
            ├───┤      ┌───┐      ┌───┬───┐
            │???│─────>│???│─────>│10 │11 │
            ├───┤      ├───┤      └───┴───┘
            │???│──┐   │???│──┐   ┌───┬───┐
            └───┘  │   └───┘  └──>│12 │13 │
                   │              └───┴───┘
                   │   ┌───┐      ┌───┬───┬───┐
                   └──>│???│─────>│14 │15 │16 │
                       ├───┤      └───┴───┴───┘
                       │???│──┐   ┌───┬───┐
                       └───┘  └──>│17 │18 │
                                  └───┴───┘

    如果我们要访问三维数组的某个元素,例如,ns[2][0][1],只需要顺着定位找到对应的最终元素15即可。

    理论上,我们可以定义任意的N维数组。但在实际应用中,除了二维数组在某些时候还能用得上,更高维度的数组很少使用。

命令行参数

  • Java程序的入口是main方法,而main方法可以接受一个命令行参数,它是一个String[]数组。这个命令行参数由JVM接收用户输入并传给main方法:

  •   public class Main {
          public static void main(String[] args) {
              for (String arg : args) {
                  System.out.println(arg);
              }
          }
      }
  • 我们可以利用接收到的命令行参数,根据不同的参数执行不同的代码。例如,实现一个-version参数,打印程序版本号:

    public class Main {
        public static void main(String[] args) {
            for (String arg : args) {
                if ("-version".equals(arg)) {
                    System.out.println("v 1.0");
                    break;
                }
            }
        }
    }
  • 上面这个程序必须在命令行执行,我们先编译它:

    $ javac Main.java
  • 然后,执行的时候,给它传递一个-version参数:

    $ java Main -version
    v 1.0
  • 这样,程序就可以根据传入的命令行参数,作出不同的响应。

到头来还是逃不过Java - 数组操作

原文:https://www.cnblogs.com/dawsonlee/p/12250905.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!