二维数组1:java中的二维数组

Posted 纵横千里,捭阖四方

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组1:java中的二维数组相关的知识,希望对你有一定的参考价值。

我们在java基础里学过Java是没有二维以上的数组的,数组的第一维的元素指向的堆内存地址又是一个数组,从而实现二维的效果。

详细情况在一般的java教程里都有,我们不做赘述,其基本结构图如下所示:

1. 二维数组的初始化

二维数组的初始化有三种常用方式:

1) int intA[][]={{1,2},{2,3},{3,4,5}};

2) int [][] intB=new int[3][5];

3) int []intC []=new int[3][];
intC[0]=new int[2];
intC[1]=new int[3];
intC[2]=new int[5];

上面第一种在面试时进行算法检验非常有用,因为很多时候代码写完之后有些case能过,有些过不了,这时候需要快速将bad case复制过来测试一下为什么,这种初始化方式无疑是最高效的。

第三种可以定义非常灵活的数组结构,但是建议不要这个干,二维数组不同维度的长度还不一样,这种情况极少。而且这么定义了之后,必须非常小心考虑越界等情况,后面可能自己都忘了。

写个代码测试一下吧:

public static void  testInit(){
       //二维数组不是规则的矩阵
       int [] intA[] ={{1,2},{2,3,4},{3,4,5,6}};

       //打印出来的都是地址

       System.out.println(intA);

       //声明一个二维数组,用于存储3个一维数组,每一个一维数据存多少个数组,不知道 
       int [][]intB=new int[3][];
       intB[0]=new int[3];  
       intB[1]=new int[]{1,2,3,4};  
       intB[2]=new int[2];  
     

       //声明一个二维数组,存储三个一维数组,每个一维数组的长度为4
       int []intC[]=new int[3][4];
       System.out.println(intC);
  }

2. 遍历

遍历方法也有三种:

1) 普通 for 循环

2) 加强 for 循环

3) 普通 for 循环+加强 for 循环

可以看到这三种不是二维数组专属的,而是循环的几种方式,如果将for换成while是不是又有很多种呢?所以我们不必关系有几种遍历的方式,重点是采用哪种循环方式更方便。少废话,直接看代码吧:

public static void search(){
       //二维数组
       int [] intA[] ={{1,2},{2,3,4},{3,4,5,6}};
       //(1)普通for循环
       for(int i=0;i<intA.length;i++){ 
           for(int j=0;j<intA[i].length;j++){ 
               System.out.print(intA[i][j]+"\\t");
          }
           System.out.println();
      }
       //(2)加强for循环
       System.out.println("\\n=========================");

       for(int[] arr:intA){  
           for(int i:arr){ 
               System.out.print(i+"\\t");
          }
           System.out.println();
      }
       //(3)普通与加强for循环的混搭
       System.out.println("\\n-------------------------");
       for(int [] arr:intA){//加强for
           for(int i=0;i<arr.length;i++){
               System.out.print(arr[i]+"\\t");
          }
           System.out.println();
      }
       System.out.println("\\n--------------------------");
       for(int i=0;i<intA.length;i++){
           for(int j:intA[i]){//加强for
               System.out.print(j+"\\t");
          }
           System.out.println();
      }
  }

3. 数组拷贝

数组整体拷贝主要有地址拷贝和值拷贝两种方式。

地址的拷贝
int[]array={11,22,33,44};
int[] arrayB=new int[5];
arrayB=array   //两个数组指向同一内存

值的拷贝
int[]array={11,22,33,44};
int[] arrayB=new int[5];
arrayB[0]=array[0];

System 类中的 arraycopy(…)方法:快速,数组大时用此方法。

public class TestArrayCopy3 {
   public static void main(String[] args) {
       int [] arrA={11,22,33,44};//源数组
       int [] arrB=new int[5];//目标数组

       System.out.println("数组拷贝之前");
       for(int num:arrB){
           System.out.print(num+"\\t");
      }
       //0       0       0       0       0
       //拷贝
       System.arraycopy(arrA, 0, arrB, 1, 2);

       System.out.println("\\n数组拷贝之后");
       for(int num:arrB){
           System.out.print(num+"\\t");
      }
       //0       11       22       0       0
  }
}

对于数组来说,还有一个Arrays的copyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。

copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值,例如:

    public static void arrayTest() {        int[] arr1 = {1, 2, 3, 4, 5};        int[] arr2 = Arrays.copyOf(arr1, 5);        int[] arr3 = Arrays.copyOf(arr1, 10);        System.out.println("arr2.size: "+arr2.length+" arr3.size: "+arr3.length);        for (int i = 0; i < arr2.length; i++)            System.out.print(arr2[i] + " ");        System.out.println();        for (int i = 0; i < arr3.length; i++)            System.out.print(arr3[i] + " ");    }

输出结果为:

arr2.size: 5 arr3.size: 101 2 3 4 5 1 2 3 4 5 0 0 0 0 0 

从上面,可以看到copy()方法也定义了新数组的大小,同事进行了赋值,如果你指定的范围超过原始数据的范围,越界的部分就是空了。

这里我开始以为是将越界的部分设置为0,但是看了一下源代码发现是没有管,因此新创建的数组元素默认值都是0。,代码如下:

    public static int[] copyOf(int[] original, int newLength) {        int[] copy = new int[newLength];        System.arraycopy(original, 0, copy, 0,                         Math.min(original.length, newLength));        return copy;    }

可见,这里底层调用的是System.arraycopy()方法来做的,这个方法是native的,我们不必再继续看了。不过传入的大小很有意思,是从(原始数组的长度,指定的长度)选择最小的向下传,而如果newLength超的元素就是没有管了

以上是关于二维数组1:java中的二维数组的主要内容,如果未能解决你的问题,请参考以下文章

java中的二维数组怎样创建?

Java实验项目二——二维数组实现九九乘法表

Java 中的二维数组

Java 中的二维数组

Java 剑指offer 二维数组中的查找

java 二维数组