Java数组

Java数组

相同类型数据的有序集合(每一个数据称为一个数组元素,每个数组元素可以通过一个下标来访问)

 

数组声明创建

声明数组
  • dataType[ ] arrayRefVar; 首选方法

  • dataType arrayRefVar[ ];

 

通过new操作符来创建数组
  • dataType[ ] arrayRefVar = new dataType[arraySize];

数组的元素可以通过索引访问的,数组的索引是从0开始的

获取数组的长度的方法:arrayRefVar .length

int类型的默认值为0

public class Demo01 {

   public static void main(String[] args) {
       //1、声明一个int类型的数组
       int[] nums;//java通常使用这种写法
       int num1[]; //是c语言和c++语言的书写方式
       //2、创建一个数组
       nums = new int[10]; //可以存放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[0]);  //输出结果为:1
       /**
    *如果没有nums[9] = 10;,那么输出的结果就为默认值,而int类型的默认值为0
        * System.out.println(nums[9]); //输出结果为 0
        */
       //计算所有元素的和
       int sum = 0;
       for (int i = 0; i < nums.length; i++) {
           sum += nums[i];
      }
       System.out.println(sum);   //输出结果为:55
System.out.println(nums[10]);  //输出结果为:会报错,报错的内容为java.lang.ArrayIndexOutOfBoundsException(数组下标越界了)
   
  }

}

 

三种初始化
  1. 静态初始化

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

  2. 动态初始化

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

  3. 数组的默认初始化

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

public class Man {
}

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]); //输出结果为:1

       //动态初始化:包含了默认初始化
       int[] b = new int[10];
       b[0] = 10;
       System.out.println(b[0]);//输出结果为:10
       System.out.println(b[1]);//输出结果为:0 (因为没有对b[1]赋值,所以默认初始化就为0)
       System.out.println(b[2]);//输出结果为:0 (因为没有对b[2]赋值,所以默认初始化就为0)

  }
}

数组的四个基本特点

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

  • 数组中的元素必须是相同类型,不可以出现其他类型

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

  • 数组变量属引用数据类型,数组也可看做对象,数组中的元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的

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

  • ArrayIndexOutOfBoundsException :数组下标越界异常!

  • 小结

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

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

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

 

数组使用

普通的For循环
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]); //输出结果为1,2,3,4,5
      }
       System.out.println("-------------------------");
       //计算所有元素的和
       int sum = 0;
       for (int i = 0; i < arrays.length; i++) {
           sum += arrays[i];
      }
       System.out.println(sum);//输出结果为15
       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);//输出结果为15
  }
}

 

For-Each的使用
public class ArrayDemo04 {
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5};

       //JDK1.5,没有下标
       //遍历arrays数组,得到数组中的元素
       for (int array:arrays) {
           System.out.println(array);
      }
  }
}
数组作方法入参
public class ArrayDemo04 {
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5};
       printArray(arrays);  //输出结果为:1 2 3 4 5
  }

   //打印数组元素
   public static void printArray(int[] arrays){
       for (int i = 0; i < arrays.length; i++) {
           System.out.print(arrays[i]+" ");
      }
  }
}
数组作返回值
package com.student.lile.array;

public class ArrayDemo04 {
   public static void main(String[] args) {
       int[] arrays = {1,2,3,4,5};
       int[] reverse = reverse(arrays);
       printArray(reverse);  //输出结果为:5 4 3 2 1
  }

   //反转数组
   public static int[] reverse(int[] arrays){
       int[] result = new int[arrays.length];

       //反转的操作
       for (int i = 0,j=result.length-1; i < arrays.length ; i++,j--) {
           result[j] = arrays[i];
      }
       return result;
  }
   //打印数组元素
   public static void printArray(int[] arrays){
       for (int i = 0; i < arrays.length; i++) {
           System.out.print(arrays[i]+" ");
      }
  }

}

多维数组

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

  • 二维数组 int[ ] [ ] a= new int[2] [5] //两行五列的数组

 

 

 

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]); //输出结果为:1 2
       System.out.println(array[0][0]); //输出结果为:1
       System.out.println(array[0][1]); //输出结果为:2
       for (int i = 0; i < array.length; i++) {
           for (int j = 0; j < array[i].length; j++) {
               System.out.print(array[i][j]+" "); //输出结果为:1 2 2 3 3 4 4 5
          }
      }
  }

   //打印数组元素
   public static void printArray(int[] arrays){
       for (int i = 0; i < arrays.length; i++) {
           System.out.print(arrays[i]+" ");
      }
  }
}

Arrays类

数组的工具类java.util.Arrays

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

 


import java.util.Arrays;

public class ArrayDemo06 {
   public static void main(String[] args) {

       int[] a = {1,2,3,4,9090,2423,453,23,45,2};
       System.out.println(a); //输出结果为:[I@1b6d3586   (hashCode)
       //打印数组元素
       System.out.println(Arrays.toString(a));//输出结果为:[1, 2, 3, 4, 9090, 2423, 453, 23, 45, 2]

       Arrays.sort(a);//数组进行排序 进行的升序
       System.out.println(Arrays.toString(a));//输出结果为:[1, 2, 2, 3, 4, 23, 45, 453, 2423, 9090]

       //查找数组元素
       System.out.println("二分查找:"+Arrays.binarySearch(a,3));//输出结果为:二分查找:3

       int[] b = new int[2];
       Arrays.fill(b,44);//对数组进行赋值
       System.out.println(Arrays.toString(b));//输出结果为:[44, 44]

       //比较数字,判断数组中是否有这个元素
       if (!a.equals(9090)){
           System.out.println("没有9090这个数字");
      }else {
           System.out.println("有9090这个数字");
      }
  }


}

 

常用的功能
  • 给数组赋值:通过fill方法

  • 对数组排序:sort方法(升序)

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

  • 查找数组元素:童话或binarySearch方法对排序好的数组进行二分查法

冒泡排序

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

时间复杂度为:O(n2) 有嵌套循环 n2表示n的二次方

冒泡排序的代码是一共两层循环,第一层(外层)表示冒泡的轮数,第二层(里层)依次比较

 


import java.util.Arrays;

public class ArrayDemo07 {
   public static void main(String[] args) {
       int[] a = {1,2,3,4,9090,2423,453,23,45,2};
       System.out.println(Arrays.toString(sort(a))); //输出结果为:[1, 2, 2, 3, 4, 23, 45, 453, 2423, 9090]

  }

   //冒泡排序
   //1.比较相邻的元素,如果第一个数比第二个大就交换位置
   //2.每次比较都会产生一个最大和最小的值,所有每次都减少一次循环
   //3.下一轮减少一次排序
   //4.依次循环,直到结束
   public static int[] sort(int[] array){

       //临时变量
       int temp = 0;

       //外层循环,决定一共循环多少次
       for (int i = 0; i < array.length-1; i++) {

           boolean flag = false; //通过flag标识,来减少没必要的比较

           //内层循环,比较两个数,一个数大于另一个则交换位置
           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.student.lile.array;

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();
      }
       /**
        * 输出结果:
        * 原始数组:
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 1 0 0 0 0 0 0 0 0
        * 0   0 0 2 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        */

       //转换为稀疏数组保存
       //获取有效值的个数
       int sum = 0;
       for (int i = 0; i < array1.length-1; i++) {
           for (int j = 0; j < array1[i].length-1; j++) {
               if (array1[i][j]!=0){
                   sum++;
              }
          }
      }
       System.out.println("======================");
       System.out.println("有效值的个数:"+sum);//输出结果为:有效值的个数:2

       //2.创建一个稀疏数组
       int[][] array2 = new int[sum+1][3];
       array2[0][0] = 11;
       array2[0][1] = 11;
       array2[0][2] = sum;
       
       //3.遍历二维数组,将非零的值存放到稀疏数组中
       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];
              }
          }
      }

       //4.输出稀疏数组
       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");
      }
       /**
        * 输出结果
        * 稀疏数组:
        * 11 11 2
        * 1   2 1
        * 2   3 2
        */

       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();
      }
       /**
        * 输出结果:
        * 还原数组:
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 1 0 0 0 0 0 0 0 0
        * 0   0 0 2 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        * 0   0 0 0 0 0 0 0 0 0 0
        */
  }
}
内存分析
Java内存
    • 存放new的对象和数组

      • 可以被所有线程共享,不会存放别的对象引用

    • 存放基本变量类型(会包括这个基本类型的具体数值)

    • 引用对象的变量(会存放在这个引用在堆里面的具体的地址)

  1. 方法区

    • 可以被所有的线程共享

    • 包含了所有的class和static变量

 

 

 



 

posted @ 2023-04-17 17:27  哎呀呀喔  阅读(88)  评论(0)    收藏  举报