zoukankan      html  css  js  c++  java
  • Java数组

    Java数组

    数组的定义

    • 数组是相同类型数据的有序集合。

    • 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。

    • 其中,每一个数据称作一个数组元素,每个数组元素可以通过下标来访问它们。

    数组声明创建

    • 首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:

      dataType[] arrayRefVar;     // 首选的方法

      dataType arrayRefVar[];     //效果相同,但不是首选方法
    • Java语言使用new操作符来创建数组,语法如下:

      dataType[] arrayRefVar = new dataType[arraySize];
    • 数组的元素是通过索引访问的,数组索引从0开始。

    • 获取数组长度:arrays.length

    内存分析

    • Java内存分析

    • 写代码画图分析内存!

    三种初始化

    • 静态初始化

      int[] a = {1,2,3};
      Man[]  mans = {new Man(1,1),new Man(2.2)};

       

    • 动态初始化

      int[] a = new int[2];
      a[0]=1;
      a[1]=2;

       

    • 数组的默认初始化

      • 数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素夜被按照实例变量同样的方式被隐式初始化。

    数组的四个基本特点

    • 其长度是确定的。数组一旦被创建,它的大小就是不可以改变的。

    • 其元素必须是相同类型,不允许出现混合类型。

    • 数组中的元素可以是任何数据类型,包括基本类型和引用类型。

    • 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。

      数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的

    数组越界

    • 下标的合法区间:[0,length-1],如果越界就会报错:

      public static void main(String[] args){
         int[] a = new int[2];
         System.out.println(a[2]);
      }
    • ArrayIndexOutOfBoundsExceeption:数组下标越界异常!

    • 小结:

      • 数组是相同数据类型(数据类型可以任意类型)的有序集合

      • 数组也是对象。数组元素相当于对象的成员变量。

      • 数组长度是确定的,不可改变的。如果越界,则报:ArrayIndexOutOfBoundsException。

    数组使用

    • For-Each循环

    • 数组作方法入参

    • 数组做返回值

    多维数组

    • 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一位数组。

    • 二位数字

      int[][] a = new int[2][5];
    • 解析:以上二维数组a可以看成一个两行五列的数组。

    • 思考:多维数组的使用?

      num[1][0];

    Arrays类

    • 数组的工具类java.util.Arrays

    • 由于数组对象本身并没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本操作。

    • 查看JDK帮助文档

    • Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而“不用”使用对象来调用(注意:是“不用"而不是”不能“)

    • 具体以下常用功能:

      • 给数组赋值:通过fill方法。

      • 对数组排序:通过sort方法,按升序。

      • 比较数组:通过equals方法比较数组中元素是否相等。

      • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。

    冒泡排序

    • 冒泡排序无疑是最为出名的排序算法之一,总共有八大排序!

    • 冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。

    • 我们看到嵌套循环,应该立马就可以得出这个算发的时间复杂度为O(n2)

    • 思考:如何优化?

    • 冒泡排序:

    public static int[] sort(int[] arrays){
       //临时变量
       int temp = 0
       //外层循环,判断我们这个要走多少次
       for(int i=0;i<arrays.length-1;i++){
           
           boolean flag = false;//通过flag标识位减少没有意义的比较
           
           //内层循环,比较判断两个数,如果第一个数比第二个数大,则交换位置
           for(int j=0;j<arrays.length-1-i;j++){
               if(arrays[j+1]<arrays[j]){
                   temp = arrays[j+1];
                   arrays[j+1] = arrays[j];
                   arrays[j] = temp;
                   flag = true;
              }
          }
           
           if(flag == false){break;}
           
      }
       return arrays;
    }

    稀疏数组

    • 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。

    • 分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据。

    • 解决:稀疏数组

      package com.cxm.array;

      public class ArrayDemo08 {
         public static void main(String[] args) {
             //1、创建一个二维数组 11*11     0:没有棋子 1:黑棋 2:白棋

             int[][] array1 = new int[11][10];//11是行数,10是列数
             array1[1][2] = 1;
             array1[2][3] = 2;
             //输出原始的数组
             System.out.println("输出原始的数组");

             for (int[] ints : array1) {
                 for (int anInt : ints) {
                     System.out.print(anInt + " ");
                }
                 System.out.println();
            }

             //转换为稀疏数组进行保存
             //获取有效值的个数
             int sum = 0;
             int captable = 0; //行数
             int row = 0; //列数
             for (int i = 0; i < array1.length; i++) {
                 captable = array1.length;
                 for (int j = 0; j < array1[i].length; j++) {
                     row = array1[i].length;
                     if(array1[i][j]!=0){
                         sum++;
                    }
                }
            }
             System.out.println(sum);

             //2、创建一个稀疏数组的数组
             int[][] array2 = new int[sum+1][3];
             System.out.println(array2.length);
             array2[0][0] = captable;//行数
             array2[0][1] = row;//列数数
             array2[0][2] = sum;//个数

             //遍历二维数组,将非零的值存到稀疏数组中
             int count = 0;
             for (int i = 1; i < array1.length; i++) {
                 for (int j = 0; j < array1[i].length; j++) {
                     if(array1[i][j]!=0){
                         count++;
                         array2[count][0] = i;
                         array2[count][1] = j;
                         array2[count][2] = array1[i][j];
                    }
                }
            }
             System.out.println("===================================");
             System.out.println("输出稀疏数组");
             for (int[] ints : array2) {
                 for (int anInt : ints) {
                     System.out.print(anInt + " ");
                }
                 System.out.println();
            }

             //输出还原数组
             int[][] array3 = new int[array2[0][0]][array2[0][1]];

             for (int i = 1; i < array2.length; i++) {
                 array3[array2[i][0]][array2[i][1]] = array2[i][2];
            }

             System.out.println("输出还原的数组");

             for (int[] ints : array3) {
                 for (int anInt : ints) {
                     System.out.print(anInt + " ");
                }
                 System.out.println();
            }


        }
      }
  • 相关阅读:
    129 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 02 懒汉式的代码实现
    128 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 03 饿汉模式 VS 懒汉模式 01 饿汉式的代码实现
    127 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 02 单例模式概述 01 单例模式的定义和作用
    126 01 Android 零基础入门 02 Java面向对象 06 Java单例模式 01 设计模式概述 01 设计模式简介
    125 01 Android 零基础入门 02 Java面向对象 05 Java继承(下)05 Java继承(下)总结 01 Java继承(下)知识点总结
    leetcode-----121. 买卖股票的最佳时机
    leetcode-----104. 二叉树的最大深度
    Json串的字段如果和类中字段不一致,如何映射、转换?
    Mybatis-Plus的Service方法使用 之 泛型方法default <V> List<V> listObjs(Function<? super Object, V> mapper)
    模糊查询
  • 原文地址:https://www.cnblogs.com/guo-blog/p/13211173.html
Copyright © 2011-2022 走看看