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,其实只是numbers和digits指向同一个数组而已,
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();
}
}
}
对于数组元素为引用类型在内存中的存储与基本类型不一样,此时数组元素仍然存放引用,指向另一块内存,在其中存放有效的数据。
图3 存放引用类型的内存分布
- java数组存放问题
- 关于字符型数组存放宽度问题
- JAVA,截取字符串,存放在数组中
- Java记录 -33- 数组存放对象地址
- 数组存放
- JavaScript 创建存放对象的数组注意的问题
- Java实现大数的阶乘(数组存放数据)
- 数组逆序存放
- 字符数组存放测试
- vector 中存放数组
- 数组最大存放空间。。。。
- C# 数组倒序存放
- c#数组倒序存放
- c#数组倒序存放
- PHP cookie存放数组
- 数组的倒序存放
- Java中实例变量位置的存放问题
- Java ArrayList中存放引用数据类型的问题
- [HDOJ 1181]深度优先搜索 vs. 广度优先搜索 (二)
- ubuntu16.04 安装 openCV3.1 问题
- javascript事件编程
- 数据库原理
- 解决跨域的方法
- java数组存放问题
- las文件格式转文本格式(Las2Txt)
- 下拉菜单
- JAVA开发工程师有前途吗?
- Linux进程间通信
- 如何修改tomcat的端口号
- 互联网服务端技术——如何学(下B)
- 2016年团体程序设计天梯赛-模拟赛 L3-1. 肿瘤诊断 (三维 BFS)
- printf和awk