九、数组

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

1、数组的常见概念

  • 数组是引用数据类型的,但数组的元素可以是任意数据类型

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

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

  • 数组分类:

    • 按照维数 一维数组,二维数组
    • 按照数组元素的类型:基本数据类型元素的数组、引用数据类型的数组

2、一维数组

2.1、一维数组的定义与初始化

//静态初始化
int[] arr = new int[]{1,2,3};
// 等同于
int[] arr1 = {1,2,3};

//动态初始化
格式:数据类型[] 变量名 = new 数据类型[数组长度]  
long[] arr = new long[10]; //能存放10个 long类型数据 的数组

2.2、数组与数组元素的访问

long[] arr = new long[10];

// 直接打印 数组,打印的是数组的地址值
System.out.println(arr);
/*
打印:[J@621be5d1
  [:是数组的表示
  J:是数组存储数据的数据类型,J表示long类型
  @:分隔符
  621be5d1:数组在内存中得知
*/

// 索引:数组的索引从0开始,就是数组的长度-1
long l1 = arr[0];
System.out.println(l1);  //默认0

2.3、测试数组中的默认值

float[] f = new float[3];
double[] d = new double[3];
char[] c = new char[3];
String[] str = new String[3];

System.out.println(f[0]); //默认0.0
System.out.println(d[0]); //默认0.0
System.out.println(c[0]); //默认空格(\u0000)
System.out.println(str[0]); //默认null

/*
        byte    0
        short   0
        int     0
        double  0
        float   0.0
        double  0.0
        boolean false
        char    \u0000  空
        String  null
*/

2.4、数组的赋值

2.5、多个数组的内存分配图

2.6、多个变量访问同一数组的内存分配图

2.7、数组中常见报错

  • 数组角标越界异常;数组访问不存在的索引
  • 空指针异常;访问数组空(null)的指向

3、内存分配

3.1、java中内存分配

栈内存: 方法运行时,进入的内存,局部变量都存放于这块内存中
堆内存: new出来的内容都会进入堆内存,并且会存在地址值
方法区: 字节码文件(.class) 加载时进入的内存
本地方法栈: 调用操作系统相关资源
寄存器: 交给cpu去使用
程序计数器
GC

3.2、jvm结构

4、二位数组

  • java语言里提供了支持多维数组的语法
  • 如果说一维数组当成几何中的线性图片,那么二维数组就相当于一个表格
  • 数组元素 为 一位数组
 public static void main(String[] args) {
     //1.
     // 二维数组静态初始化
     int[][] arr1 = new int[][]{{1,2,3},{4,5}};
     int[][] arr2 = {{1,2,3},{4,5}};
     // 二维数组动态初始化
     String[][] str1 = new String[2][3];

     String[][] str2 = new String[3][];
     str2[1] = new String[4];

     //2.调用数组中指定位置的元素
     System.out.println(arr1[0][1]);//2

     //3.获取数组的长度
     System.out.println(str1.length);//2
     System.out.println(str2[0].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();
     }

     //5.二维数组的默认值
     //外层数组: 默认值是地址值
     //内层数组: 是根据具体的数组类型来判断(和一维数组初始化一样)

     //6.内存解析
 }

上面图片中如果打印 System.out.println(arr[3][0]);, 会报Exception in thread "main" java.lang.NullPointerException 异常

5、Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法

 boolean equals(int[] a,int[] b)  //判断两个数组是否相等
     boolean isEquals = Arrays.equals(arr1,arr2);
     
 String toString(int[] a)  //输出数组信息
     String str1 = Arrays.toString(arr1);
     
 void fill(int[] a,int val)	//将指定值填充到数组之中(替换)
     Arrays.fill(a1, value);
	注:a1是一个数组变量,value是一个a1中元素数据类型的值,作用:填充a1数组中的每个元素都是value
	例如:
	boolean[] a1 = new boolean[5];
	Arrays.fill(a1,true);
	结果 a1[] = {true,true,true,true,true};
     
 void sort(int[] a)   //对数组进行排序
     Arrays.sort(arr)
     
 int binarySearch(int[] a,int key)  //对排序后数组进行二分法检索指定的值,相当于前端的indexOf      
     int index = Arrays.binarySearch(arr,56);  //负数表示未找到
posted @ 2021-06-13 08:09  火烧云Z  阅读(56)  评论(0)    收藏  举报