Java——数组

1.数组概述

  数组是存储多个变量(元素)的东西(容器),这多个变量的数据类型要一致。数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。数组分为:一维数组和二维数组

2.一维数组

  1.格式

    格式1:数据类型[] 数组名;

       格式2:数据类型 数组名[];

    type var [ ] ; 或 type [ ] var ;

    注意:这两种定义做完了,数组中是没有元素值的。所以必须初始化。

  2.初始化概述

    所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

    初始化分类:动态初始化和静态初始化。

  3.初始化方式

    动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

    静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度。

    1)动态初始化格式

       

    2)静态初始化格式

       

    3)在内存中的分配

       

      一维数组初始化后在内存中的分配图:

         

3.二维数组

  1.概述

    其实二维数组其实就是一个元素为一维数组的数组。

  2.格式

           

  3.举例

      int a[][] = newint [3][];

    a[0] = new int [2];

    a[1] = new int [4];

    a[2] = new int [3];

   图解如下:

       

      以二维数组为例,其实二维数组就相当于数组中包含数组,所以在声明的时候要先声明第一维度,如下:

      a[0] = new int [2];    相当于给第一个包含在内的数组声明了两个小格的内存,

      a[1] = new int [4];    相当于给第二个包含在内的数组声明了四个小格的内存,

      a[2] = new int [3];    相当于给第三个包含在内的数组声明了三个小格的内存,

      理解了二维数组的概念应该就能理解多维的概念

 

  4.二维数组的初识化   

      • 静态初始化:     int intA[][] = {{1,2},{3,4},{7,8,9}};
      • 动态初始化:
      • int a[][] = new int [3] [5];
        int b[][] = new int [3][];
        b[0] = new int [2];
        b[1] = new int [3];
        b[2] = new int [5];

  5.二维数组举例  

4.数组的拷贝

  使用java.lang.System类的静态方法:

public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int lenth)
  • 可以同于数组src从第srcPos项元素开始的lenth个元素拷贝到目标数组从destPos项开始的length个位置
  • 如果源数据数目超过目标数组边界会抛出IndexOutOfBpundsException异常
  • 需要注意的是,修改拷贝后的数组,源数组的值也会跟着改变,因为copy后的数组和源数组在内存空间指向的是同一地址,可以参考后面的例子来理解这句话

  publicclass Test {

public static void main(String[] args){
        //一维数组的拷贝
        String[] s = {"Mircosoft","IBM","Sun","Oracle","Apple"};
        String[] sBak = new String[6];
        System.arraycopy(s, 0, sBak, 0, s.length);
    
        for(int i=0;i<sBak.length;i++){
            System.out.print(sBak[i]+" ");
        }
        System.out.println();
        for(int i=0;i<s.length;i++){
            System.out.print(s[i]+" ");
        }
        System.out.println();
        //二维数组的拷贝
        int [][] intArray = {{1,2},{1,2,3},{3,4}};
        int [][] intArrayBak = new int[3][];
        System.arraycopy(intArray, 0, intArrayBak, 0, intArray.length);
        intArrayBak[2][1] = 100;
        for(int i = 0;i<intArray.length;i++) {
            for(int j=0;j<intArray[i].length;j++) {
                System.out.print(intArray[i][j]+"     ");
            }
            System.out.println();
        }
    }
}

  再看一个例子:
  
public class Test {
    public static void main(String[] args) {       
        int a[] = {1,2,3,4};
        int b[] = {4,2,3,5,6};
        int c[];
        int c1[];
        //相当于数组扩充,观察c1和c2的输出来参考这个函数的使用方式
        c = Arrays.copyOf(b, a.length + b.length);
        c1 = Arrays.copyOf(a, a.length + b.length);
        System.out.println("c = " + Arrays.toString(c));
        System.out.println("c1 = " + Arrays.toString(c1));
        //数组拷贝
        System.arraycopy(b, 0, c, a.length, b.length);
        System.out.println("c = " + Arrays.toString(c));       
        System.out.println("a = " + Arrays.toString(a));
        System.out.println("b = " + Arrays.toString(b));   
    }
}

5.练习

  class PaiXu{

public static void main(String[] args) {

int[][] ar = {{23,21,12,14,56,67,2,6},{12,23,22,1,4},{3,4,44,33,55}};

reverce(ar);

printArry(ar);

//质因数(完数)

for (int i = 1; i <= 10000; i++) {

int sum = 0;

for (int j = 1; j < i/2+1; j++) {

if (i%j==0) {

sum += j;

if (sum==i) {

System.out.print(i+"  ");

}

}

}

}

}

 

private static void reverce(int[][] ar) {

// TODO Auto-generated method stub

//升序

for (int i = 0; i < ar.length; i++) {

for (int j = 0; j < ar[i].length; j++) {

for (int j2 = 0; j2 < ar[i].length; j2++) {

if (ar[i][j]<ar[i][j2]) {

int temp = ar[i][j];

ar[i][j] = ar[i][j2];

ar[i][j2] = temp;

}

}

}

}

//printArry(ar);

}

 

private static void printArry(int[][] ar) {

// TODO Auto-generated method stub

for (int k = 0; k < ar.length; k++) {

for (int k2 = 0; k2 < ar[k].length; k2++) {

System.out.print(ar[k][k2]+"  ");

}

System.out.println();

}

}

}

//输出结果

2  6  12  14  21  23  56  67  

1  4  12  22  23  

3  4  33  44  55  

6  24  28  496  2016  8128  8190==》完数的输出结果 

例如:

        int a[] [] = { {1,2}, {3,4,5,6}, {7,9}};