Day08Java数组

Java数组

 

什么是数组

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

 

数组的声明和创建

 dataType[] arrayRefVar = new dataType[arrarySize];

获取数组长度:

 arrays.length
 package com.sqdht.array;
 
 public class ArrayDemo01 {
     //变量的类型 变量的名字 = 变量的值;
     //数组类型
 
     public static void main(String[] args) {
         int[] nums; //1.定义,在java中首选,声明一个数组
         int nums2[];    //在c++用的
 
         nums = new int[10]; //2.创建一个数组,这里面可以存放10个int类型的数字
 
         //3.给数组元素赋值
         nums[0] = 1;
         nums[1] = 2;
         nums[2] = 3;
         nums[3] = 4;
         nums[4] = 5;
         nums[5] = 6;
         nums[6] = 7;
         nums[7] = 8;
         nums[8] = 9;
         nums[9] = 10;
         System.out.println(nums[9]);
 
         //计算所有元素的和
         int sum = 0;
         for (int i = 0; i < nums.length; i++) {
             sum += nums[i];
        }
 
         System.out.println("总和为:" + sum);
    }
 }
 

 

三种初始化和内存分析

Java内存:

  • 堆:存放new的对象和数组;可以被所有的线程共享,不会存放别的对象引用。

  • 栈:存放基本变量类型(会包含这个基本类型的具体数值);引用对象的变量(会存放这个引用在堆里面的具体地址)。

  • 方法区:可以被所有的线程共享;包含了所有的class和static变量。

 //数组下标越界
 //System.out.println(nums[10]);

java.lang.ArrayIndexOutOfBoundsException: 10

 package com.sqdht.array;
 
 public class ArrayDemo02 {
     public static void main(String[] args) {
         //静态初始化: 创建 + 赋值
         int[] a = {1,2,3,4,5,6,7,8};
         Man[] mans={new Man(),new Man()};
 
         System.out.println(a[0]);
 
         //动态初始化:包含默认初始化
         int[] b = new int[10];
         b[0] = 10;
         b[1] = 10;
 
         System.out.println(b[0]);
         System.out.println(b[1]);
         System.out.println(b[2]);
         System.out.println(b[3]);
    }
 }
 

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

 

下标越界以及小结

数组的四个基本特点:

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

  • 元素必须是相同类型。

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

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

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

数组边界:

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

 package com.sqdht.array;
 
 public class ArrayDemo02 {
     public static void main(String[] args) {
         //静态初始化: 创建 + 赋值
         int[] a = {1,2,3,4,5,6,7,8};
         Man[] mans={new Man(),new Man()};
 
         System.out.println(a[0]);
         for (int i = 0; i <= a.length; i++) {
             System.out.println(a[i]);
        }
 
         //动态初始化:包含默认初始化
 //       int[] b = new int[10];
 //       b[0] = 10;
 //       b[1] = 10;
 //
 //       System.out.println(b[0]);
 //       System.out.println(b[1]);
 //       System.out.println(b[2]);
 //       System.out.println(b[3]);
    }
 }
 

小结:

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

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

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

 

数组的使用

 package com.sqdht.array;
 
 public class ArrayDemo03 {
     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]);
        }
         System.out.println("======================================");
         //计算所有元素的和
         int sum = 0;
         for (int i = 0; i < arrays.length; i++) {
             sum += arrays[i];
        }
         System.out.println(sum);
         System.out.println("======================================");
         //查找最大元素
         int max = arrays[0];
         for (int i = 1; i < arrays.length; i++) {
             if(arrays[i] > max){
                 max = arrays[i];
            }
        }
         System.out.println("max=" + max);
 
    }
 }
 
 package com.sqdht.array;
 
 public class ArrayDemo04 {
     public static void main(String[] args) {
         int[] arrays = {1,2,3,4,5};
 
         //JDK1.5,没有下标,For-Each循环,一般用于打印一些结果。
         for (int array : arrays) {
             System.out.println(array);
        }
 
         printArray(arrays);
         int[] reverse = reverse(arrays);
         printArray(reverse);
 
    }
 
     //打印数组元素,数组可以作为参数。
     public static void printArray(int[] arrays){
         for (int i = 0; i < arrays.length; i++) {
             System.out.print(arrays[i]+" ");
        }
         System.out.println();
    }
 
     //反转数组,数组可以作为返回值。
     public static int[] reverse(int[] arrays){
         int[] result = new int[arrays.length];
 
         //反转的操作
         for (int i = 0; i < arrays.length; i++) {
             result[arrays.length-1-i] = arrays[i];
        }
         return result;
    }
 }
 

 

二(多)维数组

  • 多维数组可以看作是数组的数组

  • 二维数组

 int a[][] = new int[2][5];

 package com.sqdht.array;
 
 public class ArrayDemo05 {
     public static void main(String[] args) {
 
         //[4][2]
         /*
             1,2 array[0]
             2,3 array[1]
             3,4 array[2]
             4,5 array[3]
          */
         int[][] array={{1,2},{2,3},{3,4},{4,5}};
 
         printArray(array[0]);
 
         System.out.println(array[2][0]);
         System.out.println(array[2][1]);
         System.out.println(array.length);
         System.out.println(array[0].length);
         for (int i = 0; i < array.length; i++) {
             for (int j = 0; j < array[i].length; j++) {
                 System.out.print(array[i][j]+" ");
            }
        }
    }
 
     //打印数组元素,数组可以作为参数。
     public static void printArray(int[] arrays){
         for (int i = 0; i < arrays.length; i++) {
             System.out.print(arrays[i]+" ");
        }
         System.out.println();
    }
 }
 

 

Arrays类

数组工具类java.util.Arrays

Arrays类中的方法都是static修饰的静态方法,可以使用类名直接调用。

 package com.sqdht.array;
 
 import java.util.Arrays;
 
 public class ArrayDemo06 {
     public static void main(String[] args) {
 
         int[] a = {1,2,3,4,9000,31231,543,21,3,23};
 
         System.out.println(a);  //[I@1b6d3586
         //打印数组元素Arrays.toString()
         System.out.println(Arrays.toString(a));
         printArray(a);
 
         Arrays.sort(a); //数组进行排序:升序
         System.out.println(Arrays.toString(a));
 
         Arrays.fill(a,2,4,0);   //数组填充,在第2个到第4个用0填充a
         System.out.println(Arrays.toString(a));
    }
 
     public static void printArray(int[] a){
         for (int i = 0; i < a.length; i++) {
             if(i == 0){
                 System.out.print("[");
            }
 
             if(i == a.length-1){
                 System.out.println(a[i] + "]");
            }else {
                 System.out.print(a[i] + ", ");
            }
 
        }
    }
 }
 

 

冒泡排序

最出名的排序算法之一,总共有八大排序!

时间复杂度O(n^2)

 package com.sqdht.array;
 
 import java.util.Arrays;
 
 public class ArrayDemo07 {
     public static void main(String[] args) {
         int[] a={2,5,6,1,8,3,45};
 
         int[] sort=sort(a); //调用完我们自己写的方法之后,返回一个排序后的数组
         System.out.println(Arrays.toString(sort));
    }
 
     //冒泡排序
     //1.比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换它们的位置。
     //2.每次比较,都会产生出一个最大,或者最小的数字。
     //3.下一轮则可以少一次比较。
     //4.依次循环,直到结束!
     public static int[] sort(int[] array){
         //临时变量
         int temp = 0;
         boolean flag = false; //通过flag标识位减少没有意义的比较
         //外层循环,判断我们这次要走多少步
         for (int i = 0; i < array.length-1; i++) {
             //内层循环,判断两个数,如果第一个数比第二个大,则交换位置
             for (int j = 0; j < array.length-1-i; j++) {
                 if (array[j+1] < array[j]){
                     temp = array[j];
                     array[j] = array[j+1];
                     array[j+1] = temp;
                     flag = true;
                }
 
                 if(flag = false){
                     break;
                }
            }
        }
         return array;
 
    }
 }
 

 

稀疏数组

当数组中大部分元素为0或者同一个值,可以使用稀疏数组。

 package com.sqdht.array;
 
 import java.util.Arrays;
 
 public class ArrayDemo08 {
     public static void main(String[] args) {
         //1. 创建一个二维数组11*11 0:没有棋子 1:黑棋 2:白棋
 
         int[][] array1 = new int[11][11];
         array1[1][2] = 1;
         array1[2][3] = 2;
         //输出原始数组
         System.out.println("输出原始的数组");
 
         for (int[] ints : array1) {
             for (int anInt : ints) {
                 System.out.print(anInt + "\t");
            }
             System.out.println();
        }
 
         System.out.println("=====================================");
         //转换为稀疏数组保存
         //获取有效值的个数
         int sum = 0;
         for (int i = 0; i < 11; i++) {
             for (int j = 0; j < 11; j++) {
                 if (array1[i][j] != 0) {
                     sum++;
                }
            }
        }
         System.out.println("有效值的个数:" + sum);
 
         //2.创建一个稀疏数组来代表
         int[][] array2 = new int[sum+1][3];
 
         array2[0][0] = 11;
         array2[0][1] = 11;
         array2[0][2] = sum;
 
         //遍历二维数组,将非零的值,存放到稀疏数组中
         int count = 0;
         for (int i = 0; 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("稀疏数组:");
         for (int i = 0; i < array2.length; i++) {
             System.out.println(array2[i][0] + "\t"
                 + array2[i][1] + "\t"
                 + array2[i][2] + "\t");
        }
 
         System.out.println("=======================================");
         System.out.println("还原");
         //1.读取稀疏数组
         int[][] array3 = new  int[array2[0][0]][array2[0][1]];
 
         //2.给其中的元素还原它的值
         for (int i = 1; i < array2.length; i++) {
             array3[array2[i][0]][array2[i][1]]=array2[i][2];
        }
 
         //3.打印
         System.out.println("输出还原的数组");
 
         for (int[] ints : array3) {
             for (int anInt : ints) {
                 System.out.print(anInt + "\t");
            }
             System.out.println();
        }
 
    }
 }
 

 

posted @ 2021-11-03 17:21  sqdht  阅读(18)  评论(0)    收藏  举报