基本语法(三):数组

146 阅读3分钟

一维数组的使用:


声明和初始化

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

调用指定位置元素

 //2.使用指定位置的元素:通过下标/索引:[0,length-1]
         names[0] = "yyy";
         names[1] = "zs";
         names[2] = "ls";
         names[3] = "wxm";
         names[4] = "wkm";

数组长度和遍历

 //3.获取数组长度:属性length
         System.out.println(ids.length + " " + names.length);// 3 5
         
         //4.遍历数组
         for(int i = 0; i < names.length; i++)
             System.out.println(names[i]);

数组元素初始化默认值

基本数据类型:

  • 整型(int\short\byte\long):0
  • 浮点(float\double):0.0
  • 字符(char):0(“\u0000”)
  • 布尔(boolean):false

引用数据类型,目前已学的:

  • String:null

数组的内存解析

内存结构规范在JVM中,包括:

  • 栈:局部变量
  • 堆:new出来的结构(对象、数组)
  • 方法区:常量池、静态域、
 int[] arr = new int[]{1,2,3};
 String[] arr1 = new String[4];
 arr1[1] = "刘德华";
 arr1[2] = "xxx";
 String[] arr1 = new String[3];

以上一段代码为例,说明内存解析的具体过程(此处地址值只为说明问题,不具有严格准确性):

image-20221002171657571

  1. 声明arr局部变量在栈(假设此段代码在main方法中声明),int数组各个元素保存在堆区,未初始化的初始值为0,同时栈区的arr保存地址0x34ab。在此处静态初始化三个元素分别为1、2、3。
  2. 同理,arr1变量本身在栈区,其元素在堆区的0x12ab,此地址值也保存在栈arr1中。String未初始化时是null,3、4句初始化了两个元素。
  3. 再次对arr1变量声明时,就是重新在堆区找了一块能够存放3个String的区域,地址为0x5566,此值替换了原先的0x12ab。所以在此之后,不可能通过arr1访问到0x12ab的四个元素的具体内容。

多维数组的使用

同一维数组的六个注意点:

 package com.coderleo.arraytest;
 ​
 public class TwodimArray {
 ​
     public static void main(String[] args) {
         //1.声明与初始化
         //1.1标准静态初始化:
         int[][] arr11 = new int[][]{{1,2,3},{4,5},{6,7,8}};
         
         //1.2标准动态初始化:
         String[][] arr12 = new String[3][2];
         //或者:
         String[][] arr13 = new String[3][];//不写列号
         
         //也可以这么写:
         int[] arr4[] = new int[][]{{1,2,3},{4,5},{6,7,8}};//一个[]放在类型名称后
         int[] arr5[] = {{1,2,3}, {4,5,9,10}, {6,7,8}};//省略new int关键字和[][]
         
         
         //2.调用元素
         System.out.println(arr11[1][1]);//5
         System.out.println(arr12[2][1]);//null
         
         /*对于arr13,还没有确定列号,即每行也是一个未确定个数的一维数组,
         所以在访问前要先申请,否则就会报错:空指针异常*/
         arr13[1] = new String[4];
         System.out.println(arr13[1][3]);//null
         
         
         //3.获取数组的长度
         System.out.println(arr4.length);//3
         System.out.println(arr5[1].length);//4
         
         //4.遍历二维数组:双重循环
         
         //5.默认初始化1
         System.out.println(arr11[1]);//外层元素的地址:[I@15db9742
         System.out.println(arr12);//二维数组地址:[[Ljava.lang.String;@6d06d69c
 ​
         //默认初始化2,不带列号的情况
         System.out.println(arr13[2]);//null
         
         //6.内存解析
         
         
     }
 ​
 }
 ​

Arrays类简介

java.util.Arrays:操作数组的工具类,包含了很多操作数组的方法

这里简介几个方法:

 package com.coderleo.arraytest;
 ​
 import java.util.Arrays;
 ​
 public class ArraysMethods {
 ​
     public static void main(String[] args) {
         /*1.boolean equals(int[] a, int[] b)
         judge whether two arrays are equal?*/       
         int[] arr1 = {1,2,3,42};
         int[] arr2 = {12, 48, 3, -6};
         System.out.println(Arrays.equals(arr1,arr2));//false
         int[] arr3 = {1,2,3,4};
         int[] arr4 = {1,2,3,4};
         System.out.println(Arrays.equals(arr3, arr4));//true
         
         
         /*2.String toString(int[] a):output the array by String
          * */
         System.out.println(Arrays.toString(arr1));//[1, 2, 3, 42]
         
         
         /*3.void fill(int[] a,int val):fill the "val" with array "a"
          * */
         Arrays.fill(arr1, -3);
         System.out.println(Arrays.toString(arr1));//[-3, -3, -3, -3]
         
         
         /*4.void sort(int a):sort this array
          * */
         Arrays.sort(arr2);
         System.out.println(Arrays.toString(arr2));//[-6, 3, 12, 48]
         
         
         /*5.int binarySearch(int[] a, int key):
          * */
         int[] arr5 = {-98,-34,2,34,54,66,79,105,211,333};
         System.out.println(Arrays.binarySearch(arr5, 79));//index is 6
         System.out.println(Arrays.binarySearch(arr5, 78));//index is negative
         
     }
 ​
 }
 ​