Java开发——6.内存分配(堆、栈以及参数的值传递+引用传递)

简介: 内存分配(堆、栈以及参数的值传递+引用传递)

内存:

内存是计算机中的重要原件,临时存储区域,作用是运行程序。

我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。

必须放进内存中才能运行,运行完毕后会清空内存

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。


此处补充内存和硬盘的区别:

1.内存是指安装在系统板上的随机存取内存,而硬盘驱动器是磁盘的主轴,也称为硬盘。

2.内存容量范围从 128 MB 到 4 GB,而硬盘容量范围从 320 GB 到 1TB。

3.内存中的存储类型是临时的(如果一断电内存中的数据就会丢失),而硬盘中的存储类型是永远。

4.内存:不允许我们存储个人数据;而是用于存储计算机数据。它读取和写入数据,并且会继续保存在内存,除非系统关闭。硬盘是一种可预测的存储器,可以让用户存储和擦除数据;存储在硬盘上的所有数据在使用期间和使用后都不会自动清除。

拓展:

RAM,一般指随机存取存储器。

随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器。RAM即大家常说的运行内存,简称运存,是一种在手机中用来暂时保存数据的元件,相当于电脑中的内存条。


Java中的内存分配

image.png


publicclassDemo{
publicstaticvoidmain(String []args){
intnum=5;
intarr [] =newint []{1,2,3};
    }
}


栈内存:一般存放基本数据类型的值;当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。


堆内存:一般存放引用数据类型的值;在栈中存储的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。

引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。

例如:

int arr [] = new int []{1,2,3};

int sum = arr[2]; sum就是一个变量。

而数组和对象本身仍存放在堆内存中,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在一个不确定的时间被垃圾回收器释放掉才能彻底释放内存。

这个也是Java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

image.png



值传递的本质:

在参数传递的过程中,原来参数值不会发生改变!



publicstaticvoidmain(String[] args) {
//num 就是实参:实参是定义在方法之外类之中intnum=15;
System.out.println("值传递之前:"+num);
zhiChuanDi(num);
System.out.println("值传递之后:"+num);
}
publicstaticvoidzhiChuanDi(intnumber){
//此处的number 就是形参:形参是定义在方法之中的number=150;
    }

图解分析:

主要原因:方法存储在栈内存中的,栈内存中的方法会随着方法的调用完成而消失;所以尽管num被当做参数传进了zhiChuanDi()的有参方法中,并且发生了重赋值的步骤,但是整个过程并不会影响原来的num实参。相当于复制了一份num,并把复制后的num当做形参传递给了zhiChuanDi()的有参方法,实际的num是不变的。


image.png


引用传递的本质:

在进行参数传递的过程中,发生了参数值的改变。


publicstaticvoidmain(String[] args) {
intarr[] =newint[]{12,18,20};
System.out.println("引用传递之前:"+arr[0]);
yinYongChuanDi(arr);
System.out.println("引用传递之后:"+arr[0]);
Stringstr="小红";
System.out.println("引用传递之前:"+str);
yinYongChuanDi2(str);
System.out.println("引用传递之后:"+str);
    }
publicstaticvoidyinYongChuanDi(int []arr){
arr[0] =66;
    }
publicstaticvoidyinYongChuanDi2(Stringstr){
str="小明";
    }

图解分析:

这个过程相当于,人的名字一样;大多数人的名字都会重复,但是每个人对应的身份证是不同的!因为new对象,对象的值是存在于堆内存中的,要想获取堆内存中的具体指,是通过底层的地址值进行访问的,所以以参数传过去的arr数组,实际上是传的一个具体实际的arr数组,所以对arr[0]进行参数重赋值的过程,是对底层堆内存中的数据进行修改的;所以数据在进行参数传递的过程中发生了改变。

image.png

但是:我下面举了一个例子,是String类型的字符串,在进行参数的传递过程中,值并没有发生改变。虽然String类型也是引用数据类型,但是他发生参数传递的过程相当于基本数据类型,因为他并没有new一个对象!所以此处的String为特殊例子。

相关文章
|
1天前
|
Java 索引
Java String应用与开发
Java String应用与开发
8 0
|
1天前
|
安全 Java 开发者
构建高效微服务架构:后端开发的新范式Java中的多线程并发编程实践
【4月更文挑战第29天】在数字化转型的浪潮中,微服务架构已成为软件开发的一大趋势。它通过解耦复杂系统、提升可伸缩性和促进敏捷开发来满足现代企业不断变化的业务需求。本文将深入探讨微服务的核心概念、设计原则以及如何利用最新的后端技术栈构建和部署高效的微服务架构。我们将分析微服务带来的挑战,包括服务治理、数据一致性和网络延迟问题,并讨论相应的解决方案。通过实际案例分析和最佳实践的分享,旨在为后端开发者提供一套实施微服务的全面指导。 【4月更文挑战第29天】在现代软件开发中,多线程技术是提高程序性能和响应能力的重要手段。本文通过介绍Java语言的多线程机制,探讨了如何有效地实现线程同步和通信,以及如
|
4天前
|
JavaScript 前端开发 Java
【JAVA面试题】什么是引用传递?什么是值传递?
【JAVA面试题】什么是引用传递?什么是值传递?
|
6天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
7天前
|
存储 Java 测试技术
一文搞清楚Java中的方法、常量、变量、参数
在JVM的运转中,承载的是数据,而数据的一种变现形式就是“量”,量分为:**常量与变量**,我们在数学和物理学中已经接触过变量的概念了,在Java中的变量就是在程序运行过程中可以改变其值的量。
14 0
|
11天前
|
Java API 开发者
Java 8新特性解析及其在企业级开发中的应用
【4月更文挑战第19天】本文将深入探讨Java 8的新特性,包括Lambda表达式、Stream API、Optional类等,并结合实例分析这些新特性在企业级开发中的优势和应用。通过阅读本文,您将了解到Java 8的新增功能以及如何在项目中灵活运用这些功能,提高代码质量和开发效率。
|
11天前
|
IDE Java 数据库连接
使用 Java 进行桌面应用开发
【4月更文挑战第19天】Java 是一款广泛应用于企业级、网络和桌面应用开发的编程语言。其跨平台特性使Java程序能在不同操作系统上运行,而JDK提供了开发所需工具和库。使用Swing等GUI库构建用户界面,结合JDBC进行数据库操作,Socket实现网络通信。虽然面临性能和用户体验的挑战,但通过优化和选用合适的IDE,Java仍能开发出高效稳定的桌面应用。
|
12天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
12天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
159 10
|
12天前
|
Java 关系型数据库 MySQL
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例
UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术,它不采用正弦载波,而是利用纳秒级的非正弦波窄脉冲传输数据,因此其所占的频谱范围很宽。一套UWB精确定位系统,最高定位精度可达10cm,具有高精度,高动态,高容量,低功耗的应用。
一套java+ spring boot与vue+ mysql技术开发的UWB高精度工厂人员定位全套系统源码有应用案例