尚学堂--Java数组

 

元素为基础数据类型数组:

 

 

元素为引用数据类型数组:

class Date{
      int year; int moth; int day;
      Date(int y; int m, int d){
        year=y ;
      month=m ;
      day=d ;
  }  
}

 

一维数组:

声明:

int arr[];
int[] arr;
int arr[5];//错误,java语言中声明数组时不能指定其长度

创建:

arr = new int[5];

初始化:

静态初始化:定义数组的同时,就为数组元素分配空间并赋值

int a[] = {1, 2, 3};

Date days[] = {
    new Date(1, 1, 2017),
    new Date(2, 1, 2017),
    new Date(3, 1, 2017)
};

动态初始化:先定义数组,再为数组元素分配空间和赋值

int a[];
a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

Date days[];
days = new Date[3];
days[0] = new Date(1, 1, 2017);
days[1] = new Date(2, 1, 2017);
days[2] = new Date(3, 1, 2017);

数组元素的默认初始化:

  数组是引用类型(除了基础数据类型之外,java其它的类型全都是引用类型),它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化

public class Test {
    public static void main(String[] args) {
        int[] a = new int[3];
        Date[] days = new Date[3];
        System.out.println(a[1]);//输出0
        System.out.println(days[1]); //输出:null
    }
}

class Date{
    int day,month,year;
    Date(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }
}

数组元素的引用

  • arrayName[index],index为数组元素的下标,可以是整型常量或整形表达式,例:a[i], a[3], a[6*i]
  • 数组元素下标从0开始,取值范围为 0~n-1
  • a.length的值为数组a的长度(元素个数),length是一个属性,而不是方法,后面不要加括号。(String那个类作为字符串也有length,也有长度,但那是个方法,要区别开来)

关于String[] args:

public class Test {
    public static void main(String[] args) {
        int[] a = {1, 2, 3, 4, 5, 6, 7};
        for(int i = 0; i < a.length; i ++) {
            System.out.println(a[i]);
        }
        //for中的i变量跟上面的i变量不冲突,局部变量,出了大括号就不认识了
        for(int i = 0; i < args.length; i ++) {
            System.out.println(args[i]);
        }
    }
}

深入理解String[] args:

public class Test {
    public static void main(String[] args){
        long l = 0;
        long l1 = 0;
        long l2 = 0;
        
        if(args.length != 3) {
            System.out.println("java Test " + "\"n1\" \"op\" \"n2\"");
            System.exit(-1);
        }

        try{
            l1 = Long.parseLong(args[0]);//parseLong可能会抛出NumberFormatException
            l2 = Long.parseLong(args[2]);
        }catch(NumberFormatException ex) {
            System.out.println("字符格式错误!");
            ex.printStackTrace();
        }
        
        if(args[1].equals("+")) {
            l = l1 + l2;
        }else if(args[1].equals("-")) {
            l = l1 - l2;
        }else if(args[1].equals("x")) {
            l = l1 *l2;
        }else if(args[1].equals("/")) {
            l = l1 / l2;
        }else {
            System.out.println("The message is not correct!");
            System.exit(-1);
        }
        System.out.println(l);
    }
}

练习:

要求:

1、命令行上读取多个数字,
2、构建成int类型的数组,
3、由大到小排序

public class Test {
    public static void main(String[] args) {
        //命令参数赋值给数组intArr[]
        int intArr[] = new int[args.length];
        for(int i = 0; i < args.length; i ++) {
            //String类型强制转换成int类型
            intArr[i] = Integer.parseInt(args[i]);
            //System.out.println(intArr[i] + " ");
        }

        //对args数组进行从小到大排序
        for(int i = 0; i < intArr.length - 1; i ++){
            for(int j = 0; j < intArr.length - 1 - i; j ++){
                if(intArr[j] > intArr[j + 1]) {
                    int temp = intArr[j + 1];
                    intArr[j + 1] = intArr[j];
                    intArr[j] = temp;
                }
            }
        }
        //输出数组元素
        for(int t = 0; t < intArr.length; t ++){
            System.out.print(intArr[t] + " ");
        }
    }
}

二维数组:

1、数组可以看成是以数组为元素的数组    例:int a[][] = {{1,2},{3,4,5,6},{7,8,9}};

2、java中多维数组的声明和初始化应按从高维到低维的顺序进行(从第一个中括号到第n个中括号)

int a[][] = new int[3][];
a[0] = new int[2];
a[1] = new int[4];
a[2] = new int[3];
int t[][] = new int[][3];//非法

 静态初始化:

int a[][] = {{1,2},{3,4},{5,6,7}};
int a[3][2] = {{1,2},{3,4},{5,6}};//非法,静态初始化方括号不要加数字

动态初始化:

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];

数组拷贝:

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

public static void arraycopy(Object src, int srcPos, Object dest,int destPos,int length)

Object src 源数组
int srcPos 源数组起始位置
Object dest 目标数组
int destPos 目标数组起始位置
int length 拷贝的长度

如果源数据数目超过目标数组边界会抛出IndexOutOfBoundsException异常

//拷贝字符串到另一个数组,拷贝一个二维数组到另一个二维数组
import java.lang.System.*;

public class Test{
    public static void main(String[] args) {
        String[] arr1 = {"hello","this","is","my","dog"};
        String[] arr2 = new String[6];
        //数组拷贝
        System.arraycopy(arr1, 0, arr2, 0, arr1.length);

        for(int i = 0; i < arr2.length; i ++) {
            System.out.print(arr2[i] + " ");
        }

        System.out.println();

        int[][] i1= {{1,2},{1,2,3},{3,4}};
        int[][] i2= new int[3][]; 
        //数组拷贝
        System.arraycopy(i1, 0, i2, 0, i1.length);
        //输出i2的全部元素
        for(int i = 0; i < i2.length; i ++) {
            for(int j = 0; j < i2[i].length; j++) {
                System.out.print(i2[i][j] + " ");
            }
        }

        System.out.println();

        int i3[][] = new int[3][];
        i3[1] = new int[2];
        //System.out.println(i3[0][]);
        System.out.println(i3[1]);
        System.out.println(i3[1][0]);

    }
}

package guolei;

public class ArrTest {
    public static void main(String[] args) {
        String[][] str1 = new String[3][];
        str1[0] = new String[2];
        str1[1] = new String[3];
        str1[2] = new String[2];
        
        for(int i = 0; i < str1.length; i ++) {
            for(int j = 0; j < str1[i].length; j ++) {
                //以下两种方法都可行,但是第二种为什么要new String?????????????/
                //str1[i][j] = "数组的位置是:i = " + i + " j = " + j;
                str1[i][j] = new String("数组的位置是:i = " + i + " j = " + j);
            }
        }
        
        for(int i = 0; i < str1.length; i ++) {
            for(int j = 0; j < str1[i].length; j ++) {
                //输出状态:数组的位置是:i = 0 j = 0。。。。。。。
                System.out.println(str1[i][j]);
            }
        }
    }
}

 

posted @ 2017-07-25 23:19  亡命鸡礼花  阅读(125)  评论(0编辑  收藏  举报