Day09&Day10

Day 10

数组

数组的定义

数组:是相同类型数据的有序集合 数组秒速的是相同类型的若干个数据,按照一定的先后次序排列组合 去只不过,每一个数据称作一个数组元素,每个数组元素可以通过一个下表来访问他们(数组的下标是从0开始的)

数组声明创建:

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

dataType[] arrayRefvar; //首选方法
或者
dataType arrayRefvar[];  //效果相同,但不是首选

 

java语言使用new操作符来创建数组,语法如下java语言使用new操作符来创建数组,语法如下


```java
dataType[] arrayARefcar= new dataType[arraySize]
package com.Array;

public class Demo01 {
   //变量的类型 变量的名字 =变量的值
   public static void main(String[] args) {

       int  nums2[]; //1.声明一个数组;方便c语言的读写,不推荐


       int[] nums = new int[10];// 2.nums = new int[a],创建一个数组,分配空间
       /*
        nums = new int[a];在此给nums进行赋值,a表示数组空间大小
        然后这一组数只有一个名字nums,然后自动带下标,下标从0开始

        */
       //3.给数组元素赋值
       nums[0]=1;
       nums[1]=2;
       nums[2]=3;
       nums[3]=4;
       nums[4]=5;
       nums[5]=6;
       nums[6]=7;
       nums[7]=7;
       nums[8]=90;
       nums[9]=8;

       System.out.println(nums[9]);//取值
       //计算所有数组的和
       int sum = 0;

       for (int i = 0; i < nums.length; i++) {
           sum =sum+nums[i];


      }
       System.out.println("总和为:"+sum);


  }

}

数组的元素是通过索引访问的,数组索引从0开始 获取数组的长度: arrays.Length

数组的四个基本特点

  1. 其长度是 确定的,数组一旦被创建,他的大小就是不可以改变 的

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

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

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

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

数组边界: 下标的合法区间:【0,Length-1】,如果越界就会报错

内存分析

Java内存分析:

堆:存放new的 对象和数组,可以被 所有线程共享,不会存放别 的对象引用 栈:存放基本变量类型(会包含这个基本类型的具体数量) 引用对象的变量(会存放这个引用在堆里具体位置) 方法区 :可以被 所有的线程共享 包含了所以的class和static变量

三种初始化

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

package com.Array;

public class Demo02 {
   public static void main(String[] args) {
       //静态初始化:创建+赋值
       int[] a={12,3,4,5};

       //动态初始化:包含默认初始化

       int[] b=new  int [10];
       b[0]=2;
       
  }
}

数组的使用

For-Each循环

数组方法入参

数组作为返回值

package com.Array;

public class Demo04 {
   public static void main(String[] args) {
       int[] arrays = {1, 2, 3, 4, 5};

       printArray(arrays);       //打印1
       System.out.println();     //换行

       int[] reverse = reverse(arrays);

       printArray(reverse);      //打印2
       System.out.println();


       //JDK1.5之后才有的 增强for循环 ,没有下标
       //适合打印 输出,操作内部元素就不太适合
       // for (int array : arrays) {             //arrays.for加回车
       //   System.out.println(array);
       //     }
  }


   //打印数组元素
   public static  void printArray(int[] arrays){

       for (int i = 0; i < arrays.length; i++) {
           System.out.print(arrays[i]+" ");


      }
       return;
  }

   //反转
   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];
           System.out.println(result[j]);
      }

       return result;
  }



}

多维数组

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

二维数组:

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

解析:以上 二维数组a可以看成一个2行5列的数组

思考:多维数组的使用

package com.Array;

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

         //[4][2]
       /*

        */
       int [][] array={{1,2},{2,3},{3,4},{4,5}};

       printArray(array[0]);//1 2
       System.out.println();//
       System.out.println(array[0][1]);//2
       System.out.println(array.length);//4
       System.out.println(array[0].length);//2


       for (int i = 0; i < array.length; i++) {
           for (int i1 = 0; i1 < array[i].length; i1++) {
               System.out.print(array[i][i1]+" ");
          }


      }




  }
   //打印数组元素
   public static  void printArray(int[] arrays){

       for (int i = 0; i < arrays.length; i++) {
           System.out.print(arrays[i]+" ");


      }
       return;
  }

}

Arrays类

数组的工具类 java.util.Arrays Arrays类 中的方法都是static修饰的静态方法,在使用的 时候可以 直接使用类名 进行 调用 ,而不用使用对象来调用 常用的一下功能;

  1. 给是数组赋值:通过fill方法

  2. 对数组排序:通过sort方法。升序

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

  4. 查找数组元素:通过binarSearch方法能对排序号的数组进行二分查找法操作

package com.Array;

import java.lang.reflect.Array;
import java.util.Arrays;

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

       int[] a ={1,4,4,456,43645,434,};

       System.out.println(a);//会输出一个对象

       //打印数组元素
       System.out.println(Arrays.toString(a));
       printArray(a);
       System.out.println();

       //排序.升序
       Arrays.sort(a);
       System.out.println(Arrays.toString(a));

       //fill填充方法//再次表示为第二个元素到第四个元素直接填充0
       Arrays.fill(a,2,4,0);
       System.out.println(Arrays.toString(a));

  }

   //自己写的 toString方法
   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.print("]");
          }else

           System.out.print(a[i]+",");

      }
  }
}

冒泡排序

冒泡排序总共 有 八大排序 比较简单,两层循环,外层 冒泡轮数,内层 一次比较 我们看到 嵌套循环们可以得出这个算法的时间复杂度为O(n2);

package com.Array;
//,冒泡排序


import java.lang.reflect.Array;
import java.util.Arrays;

public class Demo07 {
   public static void main(String[] args) {
       int[] a={12,345,4564,456,57,23,234,2};

      sort(a);  //调用完我们自己写的排序方法以后,返回一个排序后的数组
       System.out.println(Arrays.toString(a));
       

  }

   /*
   思路:
   1.比较数组中两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
   2.每一次比较,都会产生一个最大和最小的值
   3.下一轮循环则可以减少一次排序
   4.依次循环,知道结束
    */
   public static void sort(int[] array){
       int  temp=0;
       //外出循环:判断我们这个要走多少次
       for (int i = 0; i < array.length-1; i++) {
           //内层循环,比较两个相邻的数,如果第一个比第二个数大,则交换位置
           for (int i1 = 0; i1 < array.length-1-i; i1++) {
               if (array[i1]<array[i1+1]){
                   temp=array[i1];
                   array[i1]=array[i1+1];
                   array[i1+1]=temp;

              }

          }

      }
       return ;



  }





}

 

思考:如何 优化

 

稀疏数组

package com.Array;

//稀疏数组

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

       //创建一个二维数组 11*11 0:没有棋子 1:黑棋   2:白棋子
       int[][] array1= new int[11][11];
       array1[1][2]=1;
       array1[2][3]=2;
       //输出原始的 数组
       System.out.println("输出原始数组");
       //arrays.for
       for (int[] ints : array1) {

           //,遍历整个数组
           for (int anInt : ints) {

               System.out.print(anInt+"\t");
          }
           System.out.println();

      }


       // 转换成稀疏数组来进行保存
       // 首先获取有效值的个数
       int sum=0;

       for (int i = 0; i < 11; i++) {
           for (int i1 = 0; i1 < 11; i1++) {
               if (array1[i][i1]!=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 i1 = 0; i1 < array1[i].length; i1++) {
               if (array1[i][i1]!=0){
                   count++;
                   array2[count][0]=i;
                   array2[count][1]=i+1;
                   array2[count][2]= array1[i][i+1];

              }

          }

      }

       //输出稀疏数组
       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("输出还原数组");
       //arrays.for
       for (int[] ints : array3) {

           //,遍历整个数组
           for (int anInt : ints) {

               System.out.print(anInt+"\t");
          }
           System.out.println();

      }






  }

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-08-27 18:47  冯柚子  阅读(227)  评论(0)    收藏  举报