第三章 数组

基本概念

1.定义
数组(Array)多个相同类型的数据按照一定的顺序排列的集合,并且使用一个名字命名,按照编号的方式对这些数据统一管理。
2.常见概念
①数组名
②下标/索引(从0开始)
③元素
④数组长度(元素的个数)
3.特点
①数组属于引用数据类型的变量,数组的元素可以是基本数据类型也可以是引用数据类型
②创建数组对象会在内存中开辟出一整块连续空间,数组名中的引用是这块连续空间的首地址
③数组长度确定后不可修改
④数组都是有序排列的
4.数组的分类
①按照维数
一维数组与多维数组(二维数组、三维数组…)
②按照数组元素的类型
基本数据类型元素的数组与引用数据类型元素的数组

一维数组的使用

1.一维数组的声明和初始化

  
// 1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
int[] ids;// 声明 int表明数组元素的类型,[]表明此为数组
ids = new int[] { 1001, 1002, 1003, 1004 };// 初始化 引用数据类型用 关键字new


// 1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[3];


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

// 总结:等于号前面的[]没有东西,一旦初始化数组就确定了数组长度。

2.如何调用数组的指定位置的数组元素:通过下标调用

   // 数组的下标从0开始,到数组长度-1结束
        names[0] = "zoran";
        names[1] = "wdb";
        names[2] = "ply";
        // names[3]="wdb";编译不报错 运行会报错,下标越界
        System.out.println(names[2]);// ply

3.如何表示、获取数组长度

// 数组属性:length
System.out.println(names.length);// 3
System.out.println(ids.length);// 4

4.如何遍历数组元素

  // 借助循环
    for (int i = 0; i <= names.length - 1; i++) {
        System.out.println(names[i]);// zoran wdb ply
    }

5.数组元素的默认初始化值

// 整型数组默认初始化值为0 (short long int byte)
int[] arr1 = new int[4];
for (int j = 0; j < arr1.length; j++) {
    System.out.println(arr1[j]);// 0 0 0 0
}
short[] arr2 = new short[4];
for (int j = 0; j < arr2.length; j++) {
    System.out.println(arr2[j]);// 0 0 0 0
}

long[] arr3 = new long[4];
for (int j = 0; j < arr3.length; j++) {
    System.out.println(arr3[j]);// 0 0 0 0
}

byte[] arr4 = new byte[4];
for (int j = 0; j < arr4.length; j++) {
    System.out.println(arr4[j]);// 0 0 0 0
}

// 浮点型数组默认初始化值为0.0 (double float)
double[] arr5 = new double[4];
for (int j = 0; j < arr5.length; j++) {
    System.out.println(arr5[j]);// 0.0 0.0 0.0 0.0
}
float[] arr6 = new float[4];
for (int j = 0; j < arr6.length; j++) {
    System.out.println(arr6[j]);// 0.0 0.0 0.0 0.0
}

// char型数组默认初始化值为0(ASII码为0,并不是'0')
char[] arr7 = new char[4];
for (int j = 0; j < arr7.length; j++) {
    System.out.println("----" + arr7[j] + "----");// ---- ----*4
}

//boolean型数组默认初始化值为false
boolean[] arr8 = new boolean[4];
for (int j = 0; j < arr8.length; j++) {
    System.out.println(arr8[j]);//false false false false
}

//引用数据类型数组默认初始化值为null(String 是null而非'null')
String[] arr9 = new String[4];
for (int j = 0; j < arr9.length; j++) {
    System.out.println(arr9[j]);//null null null null
}

6.数组的内存解析

暂略

综合例题

//从键盘读入学生成绩,找出最高分并输出学生成绩等级;
//成绩>=最高分-10 等级为A
//成绩>=最高分-20 等级为B
//成绩>=最高分-30 等级为C
//其余          等级为D
import java.util.Scanner;
public class ArrayDemo {
public static void main(String[] args) {
     //1.使用Scanner读取学生个数
     //2.创建int数组储存学生成绩,动态初始化
     //3.给数组元素赋值
     //4.求出数组元素中最大值
     //5.根据学生成绩与最高分的差值得到每个学生的等级和成绩
     int maxScore = 0;
     char level;
     Scanner scan = new Scanner(System.in);
     System.out.print("请输入学生个数:");
     int studentSum=scan.nextInt();
     int[] grade=new int[studentSum];
     System.out.println("请输入学生成绩:");
     for(int i=0;i<grade.length;i++) {
          int score =scan.nextInt();   
          grade[i]=score;   //这里尤其要注意,在给score键入赋值后,要将socre存入数组;存取思想尤为重要!
          if(maxScore<grade[i]) {
              maxScore=grade[i];
              
          }
     }
     System.out.println("成绩最大值为:"+maxScore);
     
     
     for(int i=0;i<grade.length;i++) {
          if(maxScore-grade[i]<=10) {
           level='A';
          }else if(maxScore-grade[i]<=20) {
              level='B';
          }else if(maxScore-grade[i]<=30) {
              level='C';
          }else {
              level='D';
          }
          
          System.out.println("学生"+"成绩为"+grade[i]+",  等级为:"+level);
     }
}
}

多维数组的使用(二维数组)

对于二维数组的理解,可以看成一维数组array1又作为另外一个一维数组array2的元素存在,从数组底层运行机制来看,其实没有多维数组

1.二维数组的声明和初始化

//静态初始化
     int[] arr =new int[] {1,2,3};
     int[][] arr1 =new int[][] {{1,2,3},{4,5},{6,7}};
     //动态初始化1
     String [][] arr2 =new String[3][2];//三行两列
     //动态初始化2
     String [][] arr3 =new String [3][];//三行
     //错误的情况
     //String [][] arr4=new Sting [][4];行数一定要有

2.如何调用二维数组的指定位置的元素

  System.out.println(arr1[0][1]);//第0行第列的元素 2
     System.out.println(arr1[2][1]);//7
     System.out.println(arr2[1][1]);//null
     //System.out.println(arr1[1][2]);空指针异常

3.如何获取数组的长度

//以数组为元素,共3个元素
     System.out.println(arr1.length);//3
     System.out.println(arr1[0].length);//3 取决于作为元素的一维数组的元素个数

4.如何遍历数组

//通过循环嵌套
     for(int i=0;i<arr1.length;i++) {
          for(int j=0;j<arr1[i].length;j++) {
              System.out.println(arr1[i][j]+" ");//1 2 3  4 5 6 7
          }
          System.out.println();
     }

5.数组元素的默认初始化值

//①行列均赋值:int[][] arr6=new int[4][3];
     //外层元素初始化值为地址值
     //内层元素的初始化值与一维数组一致
     //②行赋值;int[][] arr6 =new int[4][]
     //外层元素初始化值为null
     //内层元素不能调用 否则报错
     //规定:二层数组分为外层数组的元素,内层数组的元素
          //int[][] arr5=new int[4][3];
          //外层元素:arr[0],arr[1]等
          //内层元素:arr[0][0]等
     
     int[][] arr6=new int[4][3];
     System.out.println(arr6[0]);//[I@2401f4c3 ← 地址值
     System.out.println(arr6);//[[I@7637f22 ← 地址值
     System.out.println(arr6[0][0]);//0
     
     //float  : 0.0
     //String : null  etc

6.二维数组的内存解析

7.二维数组的使用

//举例1
public class UseArray {
//使用二维数组打印一个10行的杨辉三角
//第一行有1个元素,第n行有n个元素
//每一行的第一个元素和最后一个元素都是1
//从第三行开始,对于非第一个元素和最后一个元素的元素
//即:yanghui[i][j]=yanghui[i-1][j-1]+yanghui[i-1][j];
     public static void main(String[] args) {
           //1.声明并初始化二维数组
          int [][] yh=new int [10][];
          //2.给数组元素赋值
          for(int i=0;i<yh.length;i++) {
              yh[i]=new int[i+1];//第i行有i+1个元素
              
              //2.1给首末元素赋值
              yh[i][0]=1;
              yh[i][i]=1;
              //2.2给每一行的非首末元素赋值
          //   if(i>1) {
                   for(int j=1;j<yh[i].length-1;j++) {
                        yh[i][j]=yh[i-1][j-1]+yh[i-1][j];
                   }
              //}
          }
          
          //3.遍历输出
          for(int i=0;i<yh.length;i++) {
              for(int j=0;j<yh[i].length;j++) {
                   System.out.print(yh[i][j]+"  ");
              }
              System.out.println();
          }
     }
}



//举例2
//数组复制
public class UseArra3 {
public static void main(String[] args) {
     /*//数组的复制 反转 查找(线性查早、二分法查找)
//   创建一个类,在main方法中声明array1和array2两个变量,均为int型数组
//   使用大括号{}把array1初始化为8个素数:2.3.5.7.11.13.17.19
//   显示array1的内容
//   复制array2变量等于array1,修改array2中的偶索引元素,使其等于索引值
//   (如array[0]=0,array[]2=2)打印array1
//   
     int []array1,array2;
     array1= new int[]{2,3,5,7,11,13,17,19};
     for(int i=0;i<array1.length;i++) {
          System.out.print(array1[i]+" ");
     }
     System.out.println();
     array2= array1;//只是将array1的地址给了array2,new一次创建一个数组。
     for(int i=0;i<array2.length;i++) {
          if(i==0) {
              array2[0]=0;
          }
          if(i%2==0) {
              array2[i]=i;
          }
          System.out.print(array1[i]+" ");//只是array1发生改变了
     }*/
     
     
     //数组的复制
     int[] array1 ,array2;
     array1= new int[] {2,3,5,7,11,13,17,19};
     array2=new int[array1.length];
     for(int i=0;i<array1.length;i++) {
          array2[i]=array1[i];
          System.out.print(array1[i]);
          System.out.print(array2[i]);
     }
}
}


//举例3 数组的反转
//方式1
String[] arr=new String[]  {"JJ","DD","MM","BB","GG","AA"};
  for (int i = 0; i < arr.length/2; i++) {
          String temp =arr[i];
          arr[i]=arr[arr.length-i-1];
          arr[arr.length-i-1]=temp;
     
     }
     
//方式2
     for (int i = 0,j=arr.length-1; i < j; i++,j--) {
          String temp=arr[i];
          arr[i]=arr[j];
          arr[j]=temp;
     }
     
  for (int i = 0; i < arr.length; i++) {
          System.out.print(arr[i]+"\t");
     }




//举例4 数组的查找(搜索)
//线性查找:
     String dest = "cc";
     boolean isFlag =true;
     for (int i = 0; i < arr.length; i++) {
     if (dest.equals(arr[i])) {
          System.out.println("找到指定元素,位置为:"+i);
          isFlag=false;
          break;
          }
     }
     if(isFlag==true) {
     System.out.println("没找到");
     }
     
//二分法查找
     //前提是所要查找的数组必须有序
          int[] arr2=new  int[]{-99,-98,-52,-22,1,24,68,99,133,854};
          int dest=24;
          int  head=0;//初始首索引
          int end =arr2.length-1;//初始末索引
          boolean isFlag=true;
     while(head<=end) {
          int middle=(head+end)/2;
          if(dest==arr2[middle]) {
              System.out.println("get it!");
              isFlag=false;
              break;
          }else if(arr2[middle]>dest) {
              end=middle-1;
          }else {
              head=middle+1;
          }
     }
     
     if (isFlag==true) {
          System.out.println("no");
     }
     


//举例5 冒泡排序
//数组前后元素对比,大的放到后面,共要排序n-1趟
int[] arr=new int[] {55,-78,662,-2478,98,22,68,45,-8,0};
     for (int i = 0; i < arr.length-1; i++) {
          for (int j = 0; j < arr.length-i-1; j++) {
              if (arr[j]>arr[j+1]) {
                   int temp =arr[j];
                   arr[j]=arr[j+1];
                   arr[j+1]=temp;
              }
          }
     }
     
     
     for (int i = 0; i < arr.length; i++) {
          System.out.print(arr[i]+"\t");
     }
}
}


//举例6 快速排序

8.Arrays工具类

 int [] arr1=new int[]{1,2,3,4};
 int [] arr2=new int[]{1,3,2,4};

 //1.boolean equals(int[] a,int[] b);判断两个数组是否相等
 boolean isEquals=Arrays.equals(arr1, arr2);
 System.out.println(isEquals);

 //2.String toString(int[] a);输出数组信息
 System.out.println(Arrays.toString(arr1));

 //3.void fill(int[]a,int val);将指定值填充到数组
 Arrays.fill(arr1, 10);//全部换成10
 System.out.println(Arrays.toString(arr1));//10 10 10  10

 //4.void sort (int[] a);对数组进行排序
 Arrays.sort(arr2);
 System.out.println(Arrays.toString(arr2));

 //5.int binarySearch(int[] a,int key);二分查找
 int[] arr3=new  int[]{-99,-98,-52,-22,1,24,68,99,133,854};
 int dext =Arrays.binarySearch(arr3, 0);
 System.out.println(dext);//返回索引位置

9.数组常见异常

/*
1.数组角标越界异常:ArrayIndexOutOfBoundsExcetion
                                 数组   角标         越界         异常

2.空指针异常:NullPointerExcetion
                        空    指针    异常

*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值