专栏首页用代码征服天下java——内存中的数组

java——内存中的数组

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

基本类型数组:

我们先来看一段代码:

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赋给数组的第二个元素,此时数组的两个元素将指向有效区域,如下图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 剑指offer(3)——二维数组中的查找

    说故事的五公子
  • JS身份证合法性校验完全版

    说故事的五公子
  • 虚拟机间实现免密登录

    我们在搭建集群环境时会用到很多主机,主机之间需要互相访问,如果每次访问都需要登录就很麻烦,那么如何实现虚拟机之间的免密登录呢?

    说故事的五公子
  • Ubuntu18.04安装vsftpd的实现代码

    砸漏
  • LeetCode | 66.加一

    这道题目的思路比较符合我们平时列竖式的思路,这道题目我使用 C 语言进行完成,看我下面的分析。

    码农UP2U
  • PHP备战面试知识参考(备忘)

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/...

    泥豆芽儿 MT
  • 修改配置文件的方式修改 memcache 的缓存大小

    修改配置文件的方式修改 memcache 的缓存大小,使用 ps 相关命令查 询 memcahce 进程的信息

    院长技术
  • 免交互SSH登录工具sshpass

    使用 SSH 登录到远程 Linux 服务器时,一般默认状态下,会出现交互提示要求手动输入密码。当需要将ssh、scp等命令做成自动化脚本时,由于需要人工参与,...

    yuanfan2012
  • kubernetes工作记录(2)——基于release工程的kubernetes1.7.3 rpm包的编译生成

    使用release工程编译的方式,生成kubernetes1.7.3的rpm包。 虚拟机环境为Centos7.2。 安装git # yum -y install...

    胡了了
  • [脑书笔记]《整体性学习》2-获取和理解信息的技术

    这篇脑书继续讲整体性学习的第二部分整体性学习的技术,在《整体性学习》1里面在谈到信息进入大脑的顺序是,获取,理解,拓展,纠错和应用。这篇脑书笔记主要针对这5个步...

    rocket

扫码关注云+社区

领取腾讯云代金券