​Java入门-数组使用


今日语录:见识,见识,有见有识。

一、一维数组

  • 概念

    数组Array,是多个相同类型数据按照已定的顺序排列的集合,并使用一个名字命名,通过编号的方式对这些数据进行统一的管理。

  • 常见描述

    数组名

    下标(索引)

    元素

    数组的长度

  • 数组的特点

    1 数组是序排列的

    2 数组属于引用数据类型的变量,数组的元素,既可以是基本数据类型,也可以是引用数据类型

    3 创建数组对象会在内存中开辟一块连续的空间

    4 数组的长度一旦确定,就不能修改

  • 数组的分类

    1 照维数,一维数组,二维数组。。。

    2 照数组元素的类型,基本数据类型元素的数组、引用数据类型的数组

  • 一维数组的使用

    使用示例

    •     //1一维数组的声明和初始化
      int num; //声明
      num = 10; //初始化
      int id = 1001;//声明+初始化

      int[] ids;//声明
      //静态初始化:数组的初始化和数组元素的赋值操作同时进行
      ids = new int[] {1001,1002,1003};
      //动态初始化:数组的初始化和数组元素的赋值操作分开进行
      String[] names = new String[5];

      //错误的写法
      // int[] arr1 = new int[];
      // int[5] arr2 = new int[5];
      // int[] arr3 = new int[3]{1,2,3};

      //总结:数组一旦初始化成功了,其长度就确定了;

      // 2如何调用数组的指定位置的元素:通过角标(索引方式调用
      // 数组的角标(索引从0开始,到数组的长度-1结束
      names[0] = "王1";
      names[1] = "王2";
      names[2] = "王3";
      names[3] = "王4";
      names[4] = "王5";

      //3)数组的长度如何获取:length
      System.out.println(names.length); //输出5

      //4)如何遍历数组
      if(names.length > 0) {
      for(int i = 0;i<names.length;i++) {
      System.out.println(names[i]);
      }
      }

      //5)数组的默认初始化值
      // ***int型 数组的默认初始化值 ***:0
      ***short型 数组的默认初始化值 ***:0
      ***long型 数组的默认初始化值 ***:0
      ***double型 数组的默认初始化值 ***:0.0
      ***float型 数组的默认初始化值 ***:0.0
      ***char型 数组的默认初始化值 ***:
      ***boolean型 数组的默认初始化值 ***:false
      ***String型 数组的默认初始化值 ***:null
      int[] arr = new int[4];
      System.out.println(arr[0]);
      System.out.println("******************arr结束****************");

      short[] shortArr = new short[4];
      System.out.println(shortArr[0]);
      System.out.println("****************shortArr结束******************");

      long[] longArr = new long[4];
      System.out.println(longArr[0]);
      System.out.println("*****************longArr结束*****************");

      double[] doubleArr = new double[4];
      System.out.println(doubleArr[0]);
      System.out.println("****************doubleArr结束******************");

      float[] floatArr = new float[4];
      System.out.println(floatArr[0]);
      System.out.println("****************floatArr结束******************");

      char[] charArr = new char[4];
      System.out.println(charArr[0]);
      System.out.println("*****************charArr结束*****************");

      boolean[] booleanArr = new boolean[4];
      System.out.println(booleanArr[0]);
      System.out.println("*****************booleanArr结束*****************");

      String[] strArr = new String[4];
      System.out.println(strArr[0]);
      System.out.println("*****************strArr结束*****************");

      //6)数组在内存中的解析:

6 数组的内存解析

  • 数组声明方式

    1 静态初始化:数组的初始化和数组元素的赋值操作同时进行

    int[] ids; //声明
    ids = new int[] {1001,1002,1003};

    2 动态初始化:数组的初始化和数组元素的赋值操作分开进行

    String[] names = new String[5];
  • 特别说明

    1、数组是多个相同类型数据的组合,实现对这些数据的统一管理

    2、数组中的元素可以是任何数据类型,包括基本数据类型和引用类型,但不能混用

    3、数组创建后,如果没有复制,有默认值

    ***int型 数组的默认初始化值 ***:0
    ***short型 数组的默认初始化值 ***:0
    ***long型 数组的默认初始化值 ***:0
    ***double型 数组的默认初始化值 ***:0.0
    ***float型 数组的默认初始化值 ***:0.0
    ***char型 数组的默认初始化值 ***:
    ***boolean型 数组的默认初始化值 ***:false
    ***String型 数组的默认初始化值 ***:null

    4、使用数组的步骤:

    1、声明数组并开辟空间

    2、给数组各个元素赋值

    3、使用数组

    5、数组的下标是从0开始的。

    6、数组下标必须在指定范围内使用,否则报:下标越界异常,比如:int[] arr = new int[5];则有效下标值范围为:  0-4,超过则报数组下标越界异常

    7、数组属于引用类型,数组型数据是对象(object)

    8、数组在默认情况下是引用传递,赋的值是地址,赋值方式为引用赋值

    ​Java入门-数组使用
    • 典型例题数组反转

      /**
      *将数组 {11,22,33,44,55,66,77,88}
      反转成 {88,77,66,55,44,33,22,11}
      */
      public class ArrayTest {

      public static void main(String[] args) {
      // TODO Auto-generated method stub

      int[] arr1 = {11,22,33,44,55,66,77,88};
      //方案一
      for(int i=0;i<arr1.length/2;i++){
      int temp = arr1[arr1.length-(i+1)];
      arr1[arr1.length-(i+1)] = arr1[i];
      arr1[i] = temp;
      }
      for(int i=0;i<arr1.length;i++) {
      System.out.println(arr1[i]+"");
      }
      System.out.println("-----------------------------------------------");
      // 方案二
      int[] arr3 = {11,22,33,44,55,66,77,88};
      int[] arr2 = new int[arr1.length];
      for(int i=0;i<arr3.length;i++){
      int temp = arr3[arr3.length-(i+1)];
      arr2[i]=temp;
      }
      for(int i=0;i<arr2.length;i++) {
      System.out.println(arr2[i]+"");
      }

      }

      }

  • 数组扩容

    ​Java入门-数组使用

    ​Java入门-数组使用

2、二维数组

  • 理解

    对于二维数组的理解,我们可以看做是一维数组 array1 又作为另一个一维数组 array2 的元素存在,其实从数组底层的运行机制来看,其实没多维数组的概念。

  • 二维数组的使用

             // 1、二维数组的声明和初始化
    int[] arr = new int[] {1,2,3};
    //2、静态初始化
    int[][] arr2 = new int[][] {{1,2},{2,3,4},{5,6}};
    //3、动态初始化
    String[][] arr3 = new String[3][2];
    // 4、动态初始化2
    String[][] arr4 = new String[3][];

    // 3 种错误情况
    // String[][] arr5 = new String[][2];
    // int[5] arr6 = new int[5];
    // int[] ayy7 = new int[3]{1,2,3};

    // 2、如何调用数组指定位置的元素值
    System.out.println(arr2[1][2]); //4
    System.out.println(arr2[2][0]); //5

    //3、获取数组长度
    System.out.println(arr2.length);//3
    System.out.println(arr3.length);//3

    //4、如何遍历二维数组
    for(int i=0;i<arr2.length;i++) {
    for(int j=0;j<arr2[i].length;j++) {
    System.out.print(arr2[i][j]+" ");
    }
    System.out.println();
    }
    System.out.println("------------------int型二维数组默认值为0------------------");

    //5、二维数组元素的默认值
    int[][] arrA = new int[4][3];
    System.out.println(arrA[2][1]);

    System.out.println("--------------------short型二维数组默认值---------------------------------");
    Short[][] arrS = new Short[3][3];
    System.out.println(arrS[2][1]);

    System.out.println("----------------------String类型二维数组默认值---------------------------");
    String[][] arrString = new String[4][4];
    System.out.println(arrString[1][1]);

    System.out.println("----------------------double型二维数组默认值------------------------");
    double[][] arrD = new double[6][3];
    System.out.println(arrD[1][1]);

    运行结果:

    ​Java入门-数组使用

三、多维数组典型例题

杨辉三角

练习
使用二维数组打印一个10行的杨辉三角

提示:
1、第一行有1个元素,第n行有n个元素
2、每一行的第一个元素和最后一个元素都是1
3、从第三行开始,对于非第一个元素和最后一个元素的元素。即:
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];

练习
使用二维数组打印一个10行的杨辉三角

提示:
1、第一行有1个元素,第n行有n个元素
2、每一行的第一个元素和最后一个元素都是1
3、从第三行开始,对于非第一个元素和最后一个元素的元素。即:
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];

public class ArrayTest02 {

 public static void main(String[] args) {
  
  //1、二维数组的声明与初始化
  int[][] arr = new int[10][];
  
  //2、遍历数组
  for(int i = 0;i<arr.length;i++) {
   arr[i] = new int[i+1];
   
   //2.1 给数组首元素赋值
   arr[i][0] =1;
   
   //2.2 从第三行开始(i>=2),给每行的非首末元素赋值
   if(i > 1) {
    for(int j = 1;j<arr[i].length-1;j++) {
     arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
    }
   }
   //2.3 给每行的末元素赋值
   arr[i][i] = 1;
  }
  //3、输出杨辉三角
  for(int i = 0;i<arr.length;i++) {
   for(int j = 0;j<arr[i].length;j++) {
    System.out.print(arr[i][j]+"  ");
   }
   System.out.println();
  }
  
  
 }

}

运行结果:

​Java入门-数组使用

随机赋值

练习
创建一个长度为6int型数组,要求数组元素的值都在1-30之间,且是随机赋值,同时要求元素的
值各不相同。

public class ArrayTest02 {

 public static void main(String[] args) {
 
  Random r = new Random();
  int[] randomnumber = new int[6];
  for (int i = 0; i < 6; i++) {
   randomnumber[i] = r.nextInt(30) + 1;
   if (i > 0) {
    for (int j = 0; j < i; j++) {
     if (randomnumber[i] == randomnumber[j]) {
      randomnumber[i] = r.nextInt(30) + 1;
     }
    }
   }
   System.out.print(randomnumber[i] + " ");
  }
  
 }

}

运行结果:

​Java入门-数组使用

求数值型数组中最大值、最小值、平均值、总和等

求数值型数组中最大值、最小值、平均数、总和等

定义一个int型数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,和值,平均值并输出

public class ArrayTest02 {

 public static void main(String[] args) {
 
  int[] arr = new int[10];
  
  for(int i = 0;i<arr.length;i++) {
   arr[i] = (int)(Math.random()*(99 - 10 + 1) + 10 );
  }
  
  //求最大值
  int maxValue = 0;
  for(int i = 0;i<arr.length;i++) {
   if(arr[i] > maxValue) {
    maxValue = arr[i];
    }
   }
  System.out.println("最大值为:"+maxValue);
  
  //求最小值
  int minValue = 0;
  for(int i = 0;i<arr.length;i++) {
   if(arr[i] < minValue) {
    minValue = arr[i];
    }
   }
  System.out.println("最小值为:"+minValue);
  
  //和值
  int sum = 0;
  for(int i = 0;i<arr.length;i++) {
  
   sum = arr[i] + sum;
    
   }
  System.out.println("和值为:"+sum);
  //平均值
  int avgValue;
  avgValue = sum/arr.length;
  
  System.out.println("平均值为:"+avgValue);
  
 }

}

运行结果:

​Java入门-数组使用

数组的复制、反转、查找(线性查找、二分法查找)

使用一个简单数组
1)创建一个类,在main方法中声明arr1和arr2两个变量,他们是int[]型的数组
2)使用大括号{},把arr1初始化为8个素数:235711131719
3)显示arr1的内容
4)赋值arr2变量等于arr1,修改arr2的偶索引元素,使其等于索引[如arr[0]=0,arr[2]=2]
5)实现arr1的反转

思考:
arr1和arr2是什么关系?
答:arr1和arr2地址值都指向了堆空间的唯一的一个数组实体

拓展:修改题目:实现arr2对arr1数组的复制

public class ArrayTest02 {

 public static void main(String[] args) {
 
  int[] arr1,arr2;
  
  arr1 = new int[] {2,3,5,7,9,11,13,17,19};
  
  for(int i=0;i<arr1.length;i++) {
   System.out.print(arr1[i]+"t");
  }
  
  System.out.println("-----------数组的复制------------");
  // 不能称作是数组的复制
  arr2 = arr1;
  
  // 数组的复制
  arr2 = new int[arr1.length];
  for(int i=0;i < arr2.length;i++) {
   arr2[i] = arr1[i];
  }
  
  for(int i=0;i<arr2.length;i++) {
   if(i%2 == 0) {
    arr2[i] = i;
   }
   System.out.print(arr2[i]+"t");
  }
  System.out.println("-------------数组反转-------------------------------");
  
  // arr1的反转

  
  String[] str= new String[]{"AA","BB","CC","DD","EE"};
  
  for(int i=0 ; i < str.length / 2; i++) {
     String temp = str[i];
     str[i] = str[str.length-i-1];
     str[str.length-i-1] = temp;
     System.out.print(str[i]+"t");
 }
 
//  for(int i=0,j = str.length-1;i<j;i++,j--){
//      String temp = str[i];
//      str[i] = str[j];
//      str[j] = temp;
//      System.out.print(str[i]+"t");
//  }
  
  System.out.println("-------------线性查找示例------------");
  
  // 查找(或搜索)
  // 线性查找
  String[] str2= new String[]{"AA","BB","CC","DD","EE"};
  
  String dest = "BB";
  
  boolean isFlag = true;
  
  for(int i=0;i<str2.length;i++) {
   if(dest.equals(str2[i])) {
    System.out.println("找到了指定的元素,位置为:"+i);
    isFlag = false;
    break;
   }
   
  }
  if(isFlag) {
   System.out.println("很遗憾,没有找到的啦!");
  }
  
  System.out.println("---------二分法查找----------");
  // 前提,必须是有序的数组
  int[] str3 = new int[] {1,3,4,5,7,23,33,44,55};
  // 需要查找的值 
  int value = 3;
  // 初始的头部索引
  int head = 0;
  // 初始的末尾索引
  int end = str3.length-1
  boolean isFlagSec = true;
  while(head <= end) {
   int middle = (head+end)/2;
   
   if(value == str3[middle]) {
    System.out.println("找到元素了位置为:"+middle);
    isFlagSec = false;
    break;
   }else if(str3[middle] > value) {
    end = middle - 1;
   }else {
    head = middle + 1;
   }
  }
  if(isFlagSec) {
   System.out.println("很遗憾没有找到!");
  }
  
 }

}

运行结果:

​Java入门-数组使用

数组元素的排序算法

  • 排序的概念:假设含有n个记录的序列为{R1,R2,R3…,Rn},其相应的关键字序列为{K1,K2,K3,…,Kn}。将这些记录重新排序为{Ri1,Ri2,Ri3,….,Rin} 使得相应的关键字值满足天剑Ki1<= Ki2 <= Ki3 <= …<= Kin,这样的一种操作称为排序。

  • 衡量排序算法的优劣1、时间复杂度:分析关键字的比较次数和记录的移动次数 2、空闲复杂度:分析排序算法中需要多少的辅助内存 3、稳定性:若两条记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。

  • 排序算法分类

    1、内部排序

    指的是将需要处理的所有数据都加载到内部存储空间 中进行排序,包括(交换式排序、选择式排序和插入式排序)

    2、外部排序

    数据量过大,无法把所有数据加载到内存中进行排序,需要借助外部存储进行排序,包括(合并排序法和直接合并排序法)

  • 十大排序算法:选择排序:直接选择排序、堆排序 交换排序:冒泡排序、快速排序 插入排序:直接插入排序、折半插入排序、Shell排序 归并排序:桶式排序: 基数排序:

  • 算法五大特征:1、输入:有0个或多个输入数据,这些输入必须有清楚地描述和定义 2、输出:至少有一个或多个输出结果,不可以没有输出结果 3、有穷性(有限性):算法在有限的步骤之后会自动结束而不会陷入无限循环,并且每一个步骤可以在可接受的时间内完成 4、确定性(明确性):算法中每一步都是有确定的含义,不会出现二义性 5、可行性(有效性):算法的每一步都是清楚可行的,能让用户用纸笔计算求出答案

  • 冒泡排序案例

    介绍:

    冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依此比较相邻元素值的大小,使得值较大的元素逐渐从前向后部移动,就像水底的气泡一样逐渐向上冒。

    public class BubbleSort {
       public static void main(String[] args){
        int[] arr = new int[]{24,69,80,57,13};
        //冒泡排序
        for(int i = 0;i<arr.length - 1;i++){
         for(int j = 0;j < arr.length - 1 - i;j++){
             if(arr[j] > arr[j+1]){
                 int temp = arr[j];
                 arr[j] = arr[j+1];
                 arr[j+1] = temp;
             }
         }
     }
     for(int x =0;x<arr.length;x++){
         System.out.print(arr[x]+"t");
     }
      }
    }

    推导过程

​Java入门-数组使用

运行结果

​Java入门-数组使用

  • 快速排序:
    /**

     * 快速排序

     * 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小,

     * 则分别对这两部分继续进行排序,直到整个序列序。

     * @author shkstart

     * 2018-12-17
       */

       public class QuickSort {
       private static void swap(int[] data, int i, int j) {
        int temp = data[i];
        data[i] = data[j];
        data[j] = temp;
       }

       private static void subSort(int[] data, int start, int end) {
        if (start < end) {
         int base = data[start];
         int low = start;
         int high = end + 1;
         while (true) {
          while (low < end && data[++low] - base <= 0)
           ;
          while (high > start && data[--high] - base >= 0)
           ;
          if (low < high) {
           swap(data, low, high);
          } else {
           break;
          }
         }
         swap(data, start, high);
         

         subSort(data, start, high - 1);//递归调用
         subSort(data, high + 1, end);
        }

       }
       public static void quickSort(int[] data){
        subSort(data,0,data.length-1);
       }


       public static void main(String[] args) {
        int[] data = { 9, -163023, -30, -49252130 };
        System.out.println("排序之前:n" + java.util.Arrays.toString(data));
        quickSort(data);
        System.out.println("排序之后:n" + java.util.Arrays.toString(data));
       }
    }

运行结果:

​Java入门-数组使用


原文始发于微信公众号(Whisper Coding):​Java入门-数组使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/255405.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!