Java数组

Java数组

数组

  1. 定义:
  • 数组是相同类型数据的有序集合
  • 数组描述是若干个同类型的有先后次序的数据,每个元素可以通过下标访问
  • 数组的下标是从0开始的

数组声明创建

  1. 首先必须声明数组变量才能使用
dataType[] array;
dataType array[];
  1. Java 语言使用new来创建数组
  2. 数组元素通过索引访问,从0开始
  3. 获取数组长度:array.length,数组长度一经确定不可改变
public class Demon01 {
    public static void main(String[] args) {
        //数组类型
        int[] numbers; // 只是定义
        int nums[]; // C风格数组
        nums = new int[10]; // nums可以存放10个整型数字

        nums[0] = 1;
        nums[1] = 2;

        System.out.println(nums[8]);
        int sum = 0;
        for(int i=0;i<nums.length;i++){
            sum += nums[i];
        }
    }
}
  1. 内存分析
  • Java内存分为堆、栈、方法区
  • 堆:
  • 栈:
  • 方法区:
1. 声明数组:int[] nums;
   在栈中创建一个变量,声明式数组并不存在
2. 创建数组:nums = new int[10];
   在堆中分配一片空间,此时物理上数组才真的存在
3. 给数组元素赋值
  1. 三种初始化:
public class Demon02 {
    public static void main(String[] args) {
        //静态初始化
        int[] num1 = {1, 2, 3, 4, 5};
        //动态初始化
        int[] b = new int[10];
        //包含默认初始化,即全是0
        //数组一经分配空间就都有默认值的。
    }
}
  1. 数组的四个基本特点
  • 长度确定,一旦被创建大小就不能改变
  • 元素必须是相同类型,不允许出现不同类型
  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型
  • 数组变量属于引用类型,数组本身就是对象,对象在堆中

数组使用

  1. for-each循环
  2. 数组作为方法入参
  3. 数组作返回值
public class Demon03 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,4,5};
        //打印所有元素
        for(int i=0; i<arrays.length; i++){
            System.out.println(arrays[i]);
        }
        //求和
        int sum = 0;
        for(int i=0; i<arrays.length; i++){
            sum += arrays[i];
        }
        System.out.println(sum);
        //查找最大元素
        int max = arrays[0];
        for(int i=1; i<arrays.length; i++){
            if(max<arrays[i]){
                max = arrays[i];
            }
        }
        //for_each循环
        for (int array : arrays) {
            System.out.println(array);
        }
    }
    //打印数组元素
    public static void print(int[] arrays){
        for(int i=0; i<arrays.length; i++){
            System.out.println(arrays[i]);
        }
    }
    //反转数组
    public static int[] reverse(int[] arrays){
        int[] rev = new int[arrays.length];
        for(int i=0; i<arrays.length; i++){
            rev[arrays.length-i-1] = arrays[0];
        }
        return rev;
    }
}

多维数组

  1. 多维数组可以看成数组的数组
  2. 二维数组:
	int[][] array = new int[10][10];
public class Demon04 {
    public static void main(String[] args) {
        // 4x2的数组
        int[][] arrays = {{1,2},{2,3},{3,4},{4,5}};

        System.out.println(arrays[0][0]);
        for (int i=0; i<arrays.length; i++){
            for(int j=0; j<arrays[i].length; j++){
                System.out.println(arrays[i][j]);
            }
        }
    }
}

Arrays 类

  1. 数组工具类:java.util.arrays
  2. 工具类中提供了一个Arrays供我们使用,可以堆数组对象进行一些基本操作
  3. 因为都为static修饰的静态方法,所以不用使用对象来调用
  4. 通常有以下功能:
  • 数组全部赋某个值:fill
  • 数组排序:sort,升序
  • 比较数组:equals比较数组
  • 查找数组:binarySearch方法可以二分查找
import java.util.Arrays;

public class Demon05 {
    public static void main(String[] args) {
        int[] arrays = {1,2,3,45,6,890};
        System.out.println(arrays);
        System.out.println(Arrays.toString(arrays));
        
        Arrays.fill(arrays, 0);
    }
    public static void printArray(int[] arrays){
        System.out.print("[");
        for(int i=0; i<arrays.length;i++){
            if(i!=arrays.length-1){
                System.out.print(arrays[i]+", ");
            }else{
                System.out.println(arrays[i] + "]");
            }             
        }
    }
}

冒泡排序

  1. 总共有八大排序算法
  2. 冒泡排序的思路是简单的,即从数组一端开始每次交换相邻大小相反了的元素直至另外一段,就能得到一个最大值。
  3. 要点在于:冒泡的泡每次都必须从底端开始冒,冒到之前已经排过序的位置为止。
import java.util.Arrays;

public class Demon06 {
    public static void main(String[] args) {
        int[] arrays = {12, 1, 34, 23, 5};
        int[] sort = sort(arrays);
        System.out.println(Arrays.toString(arrays));
    }
    //比较数组中相邻的元素,进行排序
    //每次就能得到一个最大或最小的排序
    public static int[] sort(int[] arrays){
        int temp = 0;
        for(int i=0; i< arrays.length-1; i++){
            for(int j= arrays.length-1; j>i; j--){
                if(arrays[j]>arrays[j-1]){
                    temp = arrays[j];
                    arrays[j] = arrays[j-1];
                    arrays[j-1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arrays));
        return arrays;
    }
}

稀疏数组

  1. 需求:编写五子棋的游戏,存盘的功能
  • 分析:因为二维数组许多值是零,因此记录了许多无用信息。
  1. 稀疏数组:大部分元素是0或者是相同的元素,可以使用稀疏数组。
  • 处理方式:记录数组共几行几列,有多少个不同值,把不同值的元素和行列记录在一个小规模的数组里,压缩数组的规模
public class Demon07 {
    public static void main(String[] args) {
        //创建二维数组,0代表没下,1代表下了
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 1;

        for(int i=0; i<array1.length; i++){
            for(int j=0; j<array1[i].length; j++){
                System.out.print(array1[i][j]+"\t");
            }
            System.out.println();
        }
        //转换稀疏数组
        //获取有效值的个数
        int sum = 0;
        for(int i=0; i<array1.length; i++){
            for(int j=0; j<array1[i].length; j++){
                if(array1[i][j]!=0){
                    sum++;
                }
            }
        }
        //创建稀疏数组
        int[][] array2 = new int[sum+1][3];
        array2[0][0] = 11;
        array2[0][1] = 11;
        array2[0][2] = sum;
        int count = 1;
        for(int i=0; i<array1.length; i++){
            for(int j=0; j<array1[i].length; j++){
                if(array1[i][j]!=0){
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                    count++;
                }
            }
        }
        for(int i=0; i<array2.length; i++){
            for(int j=0; j<array2[i].length; j++){
                System.out.print(array2[i][j]+ "\t");
            }
            System.out.println();
        }
        //还原数组
        System.out.println("**********************");
        int temp = 1;
        int[][] array3 = new int[array2[0][0]][array2[0][1]];
        for(int i=1; i<array2[0][2]; i++){
            array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }
        for(int i=0; i<array3.length; i++){
            for(int j=0; j<array3[i].length; j++){
                System.out.print(array3[i][j]+ "\t");
            }
            System.out.println();
        }
    }
}
posted @ 2021-10-29 21:59  黑衣の甘铃儿  阅读(74)  评论(0)    收藏  举报