• java数组基础


    java中的数组是引用数据类型。

    //在栈空间声明数组引用对象
    int[] NAME;
    int NAME[];    //中括号放哪边都是等价的
    className[] NAME;
    
    //在堆空间划分数组空间并初始化数组对象
    NAME = new int[3];
    NAME = new className[3]
    
    //赋值,在堆空间中填充每个数组成员
    NAME[0]=0;NAME[1]=1;...
    className[0]=...
    
    //声明数组时直接赋值
    int[] NAME = {1,2,3};
    className[] NAME = {new className(1),new className(2),...};
    

    根据数据类型可分为两种类型:

    • (1).基础数据类型的数组。只是数组内的数据类型是基础的,数组本身仍然是引用类型,毕竟数组有两段内存空间(栈中引用变量,堆中数组对象)。
      例如:int[] a = new int[3];表示数组中有三个成员:a[0]、a[1]和a[2]。
    • (2).引用数据类型的数组。例如有一个date类,则可以date[] d = new date[3];,表示数组中有3个成员date[0]、date[1]和date[2],但每个date[*]成员自身又是一个引用对象,继续引用实际的date对象。具体的见下文。

    注意,在划分数组空间时的array[N]中,N表示的是N个对应数据类型的成员。如果是基础数据类型的数组,则N就是N个基础数据的值,例如int[3]可以是{1,2,3}、{5,6,7}。如果是引用数据类型的数组,则N就是N个引用对象。

    以下分别是基础数据类型的数组、引用类型的数组的声明、划分空间初始化和赋值填充的代码示例。

    class Date {
        int year,month,day;
        Date(int y,int m,int d) {
            year = y;month = m;day = d;
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            //
            int a1[];
            a1 = new int[3];
            a1[0]=3;a1[1]=9;a1[2]=10;
            //
            int[] a2 = new int[3];
            a2[0]=3;a2[1]=9;a2[2]=10;
            //
            int[] a3 = {3,9,10}
    
            //
            Date[] days1;
            days1 = new Date[3];
            days1[0] =  new Date(2012,3,5);
            days1[1] =  new Date(2013,4,5);
            days1[2] =  new Date(2014,5,5);
            //
            Date[] days2 = new Date[3];
            ...
            //
            Date[] day3 = (new Date(2012,3,5),new Date(2013,4,5),new Date(2014,5,5));
        }
    }
    

    二维数组

    java中的多维数组可以看作是数组的数组。例如二维数组int a[][]。声明时必须先声明左边的,再声明右边的,因为数组的数组代表没有左边的就没有右边的。

    int a[][] = {{1,2},{3,4,5,6},{7,8,9}};
    int[][] a = {{1,2},{3,4,5,6},{7,8,9}};
    
    int a[][] = new int[3][];
    a[0] = new int[2];
    a[1] = new int[4];
    a[2] = new int[3];
    a[0][0] = 1;a[0][1] = 2;
    int t1[][] = new int[][4];  //错误
    

    遍历数组

    遍历一维数组arr[]:

    for (int i = 0 ;i<arr.length;i++) {}
    
    for (int i:arr) {}
    

    遍历二维数组arr[][]:

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

    注意,使用foreach遍历方式时,type s:array的type和array的type必须能够兼容,此处的s就代表各个数组成员的值。

    例如:

    String s[] = {"Microsoft","IBM","Apple","Oracle","AliBaBa"}
    for (String x:s) {           // type = String
        System.out.println(x);   // s = "Microsoft","IBM","Apple","Oracle","AliBaBa"
    }
    

    对于不想遍历而是只想输出数组的全部元素值,可以采用java.util.Arrays类的toString()方法。

    Integer[] nums = {1,2,3,4};
    System.out.println(Arrays.toString(nums)); // return: [1, 2, 3, 4]
    

    拷贝数组

    java.lang.System类中的arraycopy()方法,因为数组在内存中是连续的,所以可以直接拷贝内存实现数组成员的拷贝。

    System.arraycopy(src,src_start_pos,dest,dest_start_pos,length)
    

    表示将src数组从src_start_pos位置开始复制,总共复制length个成员到dest数组中的第dest_start_pos处。注意可能会数组下标越界。

    String s[] = {"Microsoft","IBM","Apple","Oracle","AliBaBa"}
    String sbak[] = new String[6];
    System.arraycopy(s,0,sbak,0,s.length)
    

    但System.arraycopy()只支持同数据类型的数组进行copy,例如无法将int[] copy 到String[]中。此时只能使用遍历copy的方式一个元素一个元素地copy。

    import java.util.Arrays;
    int[] nums = {1,2,3,4};
    String[]  snums = new String[nums.length];
    for (int i=0;i<nums.length;i++) {
        snums[i] = Integer.valueOf(nums[i]).toString();
    }
    System.out.println(Arrays.toString(snums));
    

    main(String[] args)

    public static void main(String[] args) {}的main()方法中,参数为数组类型,数组名为args。参数的内容是java命令行传递的各个值。

    既然args是数组名,所以也可以使用其他字符替换args。因为是数组,所以数组的一些特性就可以使用,例如arg[0]、arg[1]、args.length等。

    例如:

    public class TestArray {
        public static void main(String [] args) {
            System.out.println(args[0] + "-" + args[1] + "-" + args[2]);
        }
    }
    

    执行时,传递参数1、2、3.

    java Test 1 2 3
    执行结果:
    1-2-3
    

    注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!

  • 相关阅读:
    创建Variant数组
    ASP与存储过程(Stored Procedures)
    FileSystemObject对象成员概要
    Kotlin 朱涛9 委托 代理 懒加载 Delegate
    Kotlin 朱涛 思维4 空安全思维 平台类型 非空断言
    Kotlin 朱涛7 高阶函数 函数类型 Lambda SAM
    Kotlin 朱涛16 协程 生命周期 Job 结构化并发
    Proxy 代理模式 动态代理 cglib MD
    RxJava 设计理念 观察者模式 Observable lambdas MD
    动态图片 Movie androidgifdrawable GifView
  • 原文地址:https://www.cnblogs.com/f-ck-need-u/p/8130501.html
Copyright © 2020-2023  润新知