数组是一种引用类型,数组引用变量只是一个引用,数组元素和数组变量在内存中时分开存放的,下面我们看一下基本类型的数组和引用类型的数组在内存中的地址分布情况

基本类型数组:

我们先来看一段代码:

public static void main(String[] args) {
int[] arr;
arr=new int[5];
for(int i=0;i<arr.length;i++) {
  arr[i]=i+10;
} }

  

1、int[] arr,仅定义了一个数组变量,此时内存情况如下图:

2、arr=new int[5],这段代码执行完成后,系统会在堆内存中为该数组分配一块内存空间,并初始化值0,如下图所示:

3、接着通过for循环遍历数组依次为数组赋值(注意:这里用for循环为数组赋值不能使用foreach遍历赋值,因为foreach(foreach语法:for (int i : arr){ })遍历时只是拷贝了数组的副本,然后将这个副本输出,所以通过foreach遍历并不会真正改变数组的值。)内存如下图:

引用类型数组:

首先定义一个Person(所有的类都是引用类型):

public class Person {

	private String name;
private int age; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
} }

  

测试代码:

public class TestArr {

	public static void main(String[] args) {
Person[] student;
student=new Person[2];
Person zhang=new Person();
zhang.setName("张三");
zhang.setAge(19); Person li=new Person();
li.setName("李四");
li.setAge(18); student[0]=zhang;
student[1]=li; System.out.println("Name"+student[0].getName()+"age"+student[0].getAge()); student[0].setName("哪吒");
System.out.println(zhang.getName());
} }

  

  

1、Person[] student,定义了一个Person类型的引用变量,此时这个变量并未指向任何有效的内存区域,此时内存如下图:

2、student=new Person[2],数组初始化,系统在堆内存中为数组分配一块内存空间,两个引用类型,值为Null,如下图:

3、声明两个Person变量,zhang和li,此时在栈内存中分配两块内存用于存储变量zhang和li,在堆内存中分配两块内存用于存储zhang和li的数据,如下图:

4、接着讲zhang赋给数组的第一个元素,li赋给数组的第二个元素,此时数组的两个元素将指向有效区域,如下图:

最新文章

  1. Excel—SUMPRODUCT用法指南
  2. 如何生成报告来枚举出整个sharepoint环境中的每个页面所使用的所有webpart
  3. Ubuntu 15.10 x64 安装 Android SDK
  4. dojo/_base/lang源码分析
  5. Visual Studio 2010 起始页中 不显示最近使用的项目问题,解决办法
  6. 如何在移动端app中应用字体图标icon fonts (转)
  7. LintCode Binary Tree Inorder Traversal
  8. CSS3 页面跳转的动画效果
  9. SSM框架
  10. iOS-音频格式转换-b
  11. How to Convert a Date Time to “X minutes ago” in C# z
  12. 实例:图像载入、显示、混合与输出[OpenCV 笔记8]
  13. VS2012中使用编译的Qt-5.1.1静态库开发程序
  14. jquery mobile 入门级实战1
  15. .NET连接SAP系统专题:.NET调用RFC几种方式(一)
  16. Cloudsim 3.0在myclipse下的安装过程
  17. WC2015 冬眠营滚粗记
  18. 八:Vue下的国际化处理
  19. Android - 文字向上翻滚效果的实现
  20. Papers | 超分辨 + 深度学习(未完待续)

热门文章

  1. CentOS 修改固定IP地址
  2. linux下查看memcache是否正常
  3. What is the use of c# “Yield” keyword ?
  4. C# - ZIP 压缩流
  5. 微信小程序之分享功能
  6. 蜜汁头文件&amp;&amp;slow slow read
  7. 安卓打包apk
  8. 通过Redis的list来实现 Server - Client 的同步通信
  9. initGanttView
  10. 视频软件——ffmpeg