关于java是值传值还是引用传值,在网上找了半天发现网上对于这个问题没有一个合理的解释,特地写了这篇文章,希望能给这个问题一个正确的解释

这个问题涉及语言层次的设计问题,所以我会列出从底向上的的所有结构,这个结构的合理性将不言自明

关于汇编语言中的立即数和直接寻址

立即数通常是指在立即寻址方式指令中给出的数

MOV EAX, 33221100H

关于这句汇编语言是将 33221100H直接放入EAX这个通用寄存器中,只需要一步

(AX全称是Accumulator Register,累加寄存器,E是extend,是代表扩展到32位

MOV指令是将源操作数复制到目的操作数)

直接寻址是在指令格式的地址的字段中直接指出操作数在内存的地址

MOV EAX, [0x04]

这句汇编语句是将0x04这个内存的值去出来放入EAX这个通用寄存器中,需要根据0x04找到这段内存,再把这段内存里面的值取出来放入EAX寄存器中

可以发现立即数消耗的CPU时钟周期要比直接寻址少,立即数要更快一些

关于C++的string内存布局

为什么这个问题要从C++的string讲起呢,因为string其实在不同情况下在内存中的存储情况不一样

当存储字符小于22的时候

 当存储字符大于22的时候

如果要存储的字符串长度(strlen 而非 sizeof)小于等于 22,则直接存储在函数栈中;最后一个字节(地址最高处)存储字符串的实际长度

如果要存储的字符串长度超过 22,会另外分配堆内存空间存储字符串本身,栈内的 24 个字节空间另有他用:
将字符串在堆中的地址存储在 24 个字节的前 8 个字节;
中间 8 个字节存储字符串的长度;
最后 8 个字节:地址最高的字节固定为 0x80,剩余字节存储分配的堆空间大小

可以发现当字符数小于22个字节的时候,马上就能找到要的内容

当大于22字节的时候就需要地址跳转了,速度要比上面慢一些

这时候你发现为什么我举汇编语言的例子了

当小于22字节的时候相当于立即数,大于22字节的时候需要寻址了

到虚拟机的内存布局

在java或者C#语言的虚拟机中

基础类型 byte, boolean, short, char int, float, long double是存放在栈内存中的,例如123

对象是放在堆内存中的,栈中只放一级索引,也就是堆的引用(或者指针)

关于栈和堆的深层次理解

在计算机底层上面特别是在硬件结构上面

cpu有专门的栈指针寄存器和基址指针寄存器寄存器(esp,ebp)来操作栈,速度比堆更快

所以让栈其实充当着目录的职责,堆充当着内容的角色,堆上的内容都是需要二级跳转的

容量低的东西,例如基础类型直接就放在栈上面了

而容量大的东西就放在堆上面

另外C++是可以在栈上面分配内存的,可以看我前面的文章

详解C++三种new的使用方法(在栈上用new生成对象)_星空_MAX的博客-CSDN博客

java是值传值还是引用传值

直接拿java举两个例子

第一个例子

int A = 123;
int B = A;

这时候输出B,还是123

第二个例子

classT A = new classT;
classT B = A;

这个例子也适用于字符串,因为java的字符串本质上就是类

这时候的B输出的classT还是A,因为它们指向的空间是一样的

本质上在栈上的是值传递,在堆上的是引用传递

从底层本质上解析java是值传值还是引用传值相关推荐

  1. java包装和引用_回顾值传递和引用传递关于Java是值传递还是引用传递,网上有不一样的说法。1、基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递。2...

    回顾值传递和引用传递 关于Java是值传递还是引用传递,网上有不一样的说法. 1.基本类型或基本类型的包装类以及String是值传递,引用类型是引用传递. 2.Java中只有值传递. 关于这个问题应该 ...

  2. java对象引用出错_“Java有值传递和引用传递”为什么错了?

    前言 初学Java的时候,老师在课堂上说"Java有值传递和引用传递",但网上"Java只有值传递"的呼声很高. 本人在查找资料的过程中,在这两个说法之间反复横 ...

  3. Java 是值传递还是引用传递

    最近整理面试题,整理到值传递.引用传递,到网上搜了一圈,争议很大.带着一脸蒙圈,线上线下查了好多资料.最终有所收获,所以分享给大家,希望能对你有所帮助.     首先说下我的感受,这个题目出的很好,但 ...

  4. Java是值传递还是引用传递

    Java是值传递还是引用传递 一.概述 在 Java 语言中,本质只有值传递,而无引用传递. 二.值类型和引用类型 值类型就是Java 中的 8 大基础数据类型: 整数型:byte.short.int ...

  5. JAVA:值传递和引用传递

    JAVA:值传递和引用传递 我们先来看一下值传递和引用传递的定义: 值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实 ...

  6. 这一次,彻底解决Java的值传递和引用传递

    本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...

  7. java引用传递106_(转载)java的值传递与引用传递

    1 说明:本文的适用对象为java初学者.如果有读者发现文章中有叙述不妥之处,请指正.2 3 今天在论坛上有人提了一个关于java中调用函数时有没有引用传递的问题,可谓是吵的不可开交.有人说java只 ...

  8. java是值传递还是引用传递_Java 到底是值传递还是引用传递?

    点赞.收藏还挺多,求一波关注 ------------------------------------------------------------ 没人邀请,自己强行回答一波. 关于这个问题,引发 ...

  9. 当面试官问我————Java是值传递还是引用传递?

    面试官:你好,你能说出下面个程序的执行结果吗? public class Test {public static void main(String[] args) {String name = &qu ...

最新文章

  1. c# poi写入e_C# 面向对象 静态类和静态成员
  2. Timer TimeTask Handler
  3. Android 精品资源(一) 2018年3月23日 星期五
  4. Dungeon Master(三维bfs)
  5. java+web提交sumbit,jsp怎么让submit不提交
  6. 当宝石遇到宝藏 “不思进取”的PopCap
  7. 无缩进的XML字符串的处理
  8. 线性回归、二次回归、随机采样一致性ransac的数据拟合
  9. 曹 雷 : 证券基金经营机构如何理解科技是投资而非投入
  10. Java数据结构——代码实现顺序表的操作
  11. FeedingBottle 3.2另一个无线破解GUI
  12. Latex科技论文写作
  13. 自然语言处理技术的进展和趋势
  14. 洛谷【P1359】租用游艇
  15. JavaSE基础笔记——File概述、方法递归、字符集、IO流
  16. 小码哥C++_面向对象
  17. html代码 小球上下波动,HTML5CSS3特效-上下跳动的小球-遁地龙卷风
  18. 朋友.心情父子.亲情
  19. 鼠标滚轮更改transform的值(vue-scroller在PC端的上下滑动)
  20. 16岁学生 自学JAV日常记录(学习日记)

热门文章

  1. java简介以及环境安装
  2. 菜鸟学习----前端vue.js学习01
  3. Docker Desktop for Windows 安装步骤
  4. 【Endnote】移动文献从一个分组到另外一个分组
  5. ActiveX控件不能示例解决方法
  6. 心理学分析,如何找回自信
  7. 基于Java毕业设计影视论坛源码+系统+mysql+lw文档+部署软件
  8. mac The C compiler is not able to compile a simple test program.
  9. 广联达综合面(测试类)
  10. 神经网络给图片生成标题,神经网络提取图片特征