数组

java是静态语言,java数组是静态的,数组在初始化之后,数组的长度是不可变的。数组必须初始化才可以使用。初始化就是为数组对象元素分配内存空间,并为每个数组元素指定初始值。

初始化两种方式:

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

  动态初始化:初始化时指定长度,系统分配初始值

例1:

public class ArrayTest{
    public static void main(String[] args){
        String[] books = new String[]{
            "疯狂java讲义",
            "轻量级javaEE企业实战",
            "疯狂Ajax讲义",
            "疯狂XML讲义"
        };
        String[] names = {
            "孙悟空",
            "猪八戒",
            "白骨精"
        };
        String[] strArr = new String[5];
        System.out.println("第1个数组的长度:" + books.length);
        System.out.println("第2个数组的长度:" + names.length);
        System.out.println("第3个数组的长度:" + strArr.length);
    }
}

内存图:

数组元素指定初始值:

  整形 --- 0

  浮点类型 --- 0.0

  字符型 --- '\u0000'

  布尔 --- false

  引用数据类型 --- null

 

java的数组变量是一种引用类型变量,数组变量并不是数组本身,只是指向堆内存中的数组对象。因此可以改变一个数组变量所引用的数组,这样可以造成数组长度可更改的假象。

前面加代码:

      books = names;
        strArr = names;
        System.out.println("-------------");
        System.out.println("books数组的长度:" + books.length);
        System.out.println("strArr数组的长度:" + strArr.length);
        books[1] = "唐僧";
        System.out.println("names数组的第二个元素是:" + books[1]);

内存图:

 

 

 

与java不同javascript可以动态改变数组长度:

<script type="text/javascript">
    var arr = [];
    document.writeln("arr的长度是:" + arr.length + +"<br/>");
    arr[2] = 6;
    arr[4] = "孙悟空";
    document.writeln("arr的长度是:" + arr.length +"<br/>");
</script>

数组一定要初始化吗?

例子:

public class ArrayTest3{
    public static void main(String[] args){
        int[] nums = new int[]{3,5,20,12};
        int prices;
        prices = nums;
        for (int i=0 ; i < prices.length ; i++){
            System.out.println(prices[i]);
        }
        prices[2] = 34;
        System.out.println("nums数组的第3个元素的值是:"  + nums[2]);
    }
}

内存图:

 


基本数据类型数组的初始化:


例子:

public class PrimitiveArrayTest{
    public static void main(String[] args){
        int[] iArr;
        iArr  = new int[]{2 , 5 , 5 , -12 ,20};
    }
}

内存图:

 

 静态初始化完成后,iArr数组变量所引用的数组所占用的内存空间被固定下来,程序员只能改变各数组元素内的只,但不能移动该数组所占用的内存空间--既不能扩大数组对象所占用的内存,也不能缩减该数组对象所占用的内存。

所有的局部变量都是放在栈内存里保存的,不管其是基本类型的变量,还是引用类型的变量,都是存储在各自的方法栈区内;但引用类型变量所引用的对象总是存储在堆内存中。

对于java语言而言,堆内存对象通常不允许直接访问,为了访问堆内存中的对象,通常只能通过引用变量。引用类型变量何时只是栈内存中的变量本身,何时又变为引用实际的java对象。规则很简单:引用变量本质上只是一个指针,只要程序通过引用变量访问属性,或者调用引用变量来调用方法,该引用变量将会由它所引用的对象代替。

 

引用类型数组的初始化:


例子:

public class Person{
    public int age;
    public double height;
    public void info(){
        System.out.println("我的年龄是:" + age + ",我的身高是:" + height);
    }
}
public class ReferenceArrayTest{
    public static void main(String[] args){
        Person[] students;
        students = new Person[2];
        System.out.println("students所引用的数组的长度是:" + students.length);
        Person zhang = new Person();
        zhang.age = 15;
        zhang.height = 158;
        Person lee = new Person();
        lee.age = 16;
        lee.height = 161;
        students[0] = zhang;
        student[1] = lee;
        lee.info();
        students[1].info();
    }
}

内存图:

  

数组元素就是变量

只要在已有的数据类型之后增加方括号,就会产生一个新的数组类型

无论哪种类型的数组,其数组袁术相当于一个普通变量,把数组类型之后的方括号去掉之后得到的类型就是该数组元素的类型

例子:

class Cat{
    double weight;
    int age;
    public Cat(double weight , int age){
        this.weight = weight;
        this.age = age;
    }
}
publiv class ArrayTest{
    public static void main(String[] args){
        int[] pos = new int[5];
        for (int  i = 0 ; i < pos.length ; i++){
            pos[i] = (i + 1) * 2;
            int a = pos[1];
            int b = 20;
            pos[2] = b;
            Cat[] cats = new Cat[2];
            cats[0] = new Cat(3.34, 2);
            cats[1] = new Cat(3.2, 2);
            Cat c1 = cats[0];
            Cat c2 = new Cat(4.3, 3);
            cats[1] = c2;
        }
    }
}

内存图:

没有多维数组

java允许将多维数组当成1维数组处理,初始化多维数组时可以只先初始化左边的维数,此时该数组每一个元素都相当于一个数组引用变量,这些数组元素还需要进一步初始化。

例子:

public class TwoDimensionTest{
    public static void main(String[] args){
        int[][] a;
        a = new int[4][];
        for (int i = 0 ; i<a.length ; i++){
            System.out.println(a[i]);
        }
        a[0] = new int[2];
        a[0][1] = 6;
        for (int i = 0 ; i<a[0].length ; i++){
            System.out.println(a[0][i]);
        }
    }
}

内存图:

 

 

 

 

 

 

 

  

  

  

  

  

  

 

posted @ 2017-02-16 18:27  guodaxia  阅读(103)  评论(0)    收藏  举报