java数组存放问题

来源:互联网 发布:云豹直播系统源码 编辑:程序博客网 时间:2024/05/18 13:09

数组引用变量是存放在栈内存(stack)中,数组元素是存放在堆内存(heap)中,通过栈内存中的指针指向对应元素在堆内存中的位置来实现访问。数组此时的存放形式如图1所示。

 

举例作一一解释。当执行方法时,该方法都会建立自身的内存栈,以用来将该方法内部定义的变量逐个加入到内存栈中,当执行结束时方法的内存栈也随之销毁,我们说所有变量存放在栈内存中,即随着寄存主体的消亡而消亡;反之,当我们创建一个对象时,这个对象被保存到运行时数据区中,以便反复利用(因为创建成本很高),此时不会随着执行方法的结束而消亡,同时该对象还可被其他对象所引用,只有当这个对象没有被任何引用变量引用时,才会由垃圾回收在合适的时间点回收,我们说此时变量所指向的运行时数据区存在堆内存中。

 

只有类型兼容(即属于同一数据类型体系且遵守优先级由低到高原则),才能将数组引用传递给另一数组引用,但仍然不能改变数组长度(仅仅只是调整数组引用指针的指向)

public class TestArrayLength { 

public static void main(String[] args) { 

        int[] numbers = { 3, 5, 12 }; 

        int[] digits = new int[4]; 

        System.out.println("digits数组长度:" + digits.length);//4 

for(int number : numbers) {

          System.out.print(number + ",");//3,5,12,         } 

         System.out.println(""); 

        for(int digit : digits) { 

            System.out.print(digit + ",");//0,0,0,0, 

        } 

        System.out.println(""); 

        digits = numbers; 

 System.out.println("digits数组长度:" + 

digits.length);//3 

    } 

虽然看似digits的数组长度看似由4变成3,其实只是numbersdigits指向同一个数组而已,

digits本身失去引用而变成垃圾,等待垃圾回收来回收(但其长度仍然为4),但其内部运行机制如图2所示。 


 

2   numbers digits的内存分布

因此当我们看一个数组时(或者其他引用变量)

,通常看成两部分:数组引用变量和数组元素本身,而数据元素是存放在堆内存中,只能通过数组引用变量来访问。

 

 

从上述的示例中看出数组中存放的是基本类型,其实数组中还可以存放引用类型的。存放基本类型的内存分布已经解释了,而存放引用类型的内存分布则相对复杂了。来看一段非常简单的程序。

public class TestPrimitiveArray { 

    public static void main(String[] args) {       

//1.定义数组 

        int[] numbers;         

//2.分配内存空间 

numbers=new int[4];

//3.为数组元素指定值

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

numbers[i]=i*10;

          }

    }

}

 

 

3       内存分布示意图

 

从图中可看出数组元素直接存放在堆内存中,当操作数组元素时,实际上是操作基本类型的变量。

接下来再看一段程序:

class Person { 

    public int age; 

public String name; 

public void display() { 

        System.out.println(name + "

的年龄是

: " + age); 

    } 

public class TestReferenceArray { 

    public static void main(String[] args) { 

//1.定义数组

        Person[] persons; 

        //2.分配内存空间

        persons = new Person[2]; 

        //3.为数组元素指定值

        Person p1 = new Person(); 

        p1.age = 28; 

        p1.name = "Miracle"; 

Person p2 = new Person(); 

        p2.age = 30; 

        p2.name = "Miracle He"; 

        persons[0] = p1; 

        persons[1] = p2; 

        //输出元素的值

         for(Person p : persons) { 

            p.display(); 

        } 

    } 

对于数组元素为引用类型在内存中的存储与基本类型不一样,此时数组元素仍然存放引用,指向另一块内存,在其中存放有效的数据。

 

 

存放引用类型的内存分布

 

 

 

 

 

 

 

0 0
原创粉丝点击