java学习笔记-----数组

时间:2023-02-25 11:06:03
                               In the Java programming language,arrays are objects(§4.3.1) ,are dynamically creaeted,and may be assigned to variables of type Object (§4.3.2). .All method of class Object may be invoked on an array.                               即数组是一个对象,它拥有Object类中的方法。
    • 验证:

              char[] ch=new char[5];              System.out.println(ch.getClass());              System.out.println(ch.getClass().getSuperclass());/*Output*class [C*class java.lang.Object*说明数组是一个类[C对象,同时基类为Object*/


  • 定义及初始化
    • 定义        
              int[] a1;//定义"一个int型数组引用",现在只是为该引用分配了足够的存储空间,但没给数组对象本身分配任何空间。              //System.out.println(a1.toString());//编译错误,原因没有初始化。在JAVA,除了类成员变量会自动初始化(数组类型初始化为0,布尔型为false,引用为null),局部变量不初始化不能直接使用,否则编译器报错。              //int[2] a2;//定义数组的时候不允许指定数组的大小,否则编译错误
    • 初始化
              int[] a1={1,2,3,4};//初始化方法1              int[] a2=new int[4];//初始化方法2,它的元素值为该元素类型的默认值(数字类型为0,布尔类型为false,引用类型为null),只是初始化数组a2是指向一个int引用的数组,并没有把int存放到数组中。              Father[] f=new Father[5];//这是运用了初始化方法2,它的元素值均为null,即都为空引用              //f[0].a=1;//直接使用空引用,运行时产生NullPointerException异常              for(Father x:f)//需要对数组中的引用进行初始化              {                     x=new Father();              }                           int[] a3=a1;//初始化方法3,复制了一个引用,注意此时a3和a1指向对一个数组对象              
    • PS:故此一般定义和初始化是一起使用




  • 常用的方法和变量
    • length:数组的长度
              int[] a1={1,2,3,4};              System.out.println(a1.length);//输出数组a1的长度4              //a1[4]++;//运行时,java会检查数组下标,一旦越界,就会抛出ArrayIndexOutOfBoundsException异常。
    • toString()和Arrays.toString():前者属于Object类的方法
   //Object.toString()    public String toString() {       return getClass().getName() + "@" + Integer.toHexString(hashCode());   }               int[] a1={1,2,3,4};              System.out.println(a1.toString());              System.out.println(Arrays.toString(a1));              /*Output:               *[I@7852e922               *[1, 2, 3, 4]               */             
    • clone():复制数组
              int[] a1={1,2,3,4};              int[] a3=a1;//这种复制方法,使得a3和a1指向同一个对象              int[] a4=a1.clone();//使用clone方法复制,a4和a1不指向同一个对象              System.out.println(a1==a3);//true              System.out.println(a1==a4);//false

  • 深入探讨
    • 对象数组和基本类型数组的唯一区别在于,对象数组存放的是对象的引用,而基本类型数组存放的是基本类型的值。
    • 方法的返回值就两种形式:1.数值(对于基本类型而言);2.引用(对于对象包括数组而言)
    • 对于多维数组中,在new只需指明第一维的维数即可。
    • 不能创建一个泛型数组(即T[] a//error;Peel<Apple>[] a//error),但是能够创建一个Object数组,再转型为T[],即(T[])new Object[4];
    • 数组不支持自动包装机制
    • System.arraycopy()数组复制,属于浅复制
    • 浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2 中依然包含对B1的引用,B1中依然包含对C1的引用。深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2 中包含对C2(C1的copy)的引用。

java学习笔记-----数组


  • CompareTo()返回值(默认情况下)
    • 如果指定的数与参数相等返回0。
    • 如果指定的数小于参数返回 -1。
    • 如果指定的数大于参数返回 1。