java局部变量 int a =1是存放在哪里

1.基本类型的 变量 a 和他所指向的值 1是存在栈里还是方法区的常量池中。
2.a中存的是1的值还是地址?

9个回答

说来惭愧,竟然都有些模糊了,一个方法中的变量名和变量值(这是两个概念)一般都是存在方法栈的本地变量数组中,有一种情况就是当变量的值为-128~127时,变量的值不会新建内存而是直接引用方法区常量池中的值。
所以你上面的第一个问题是,a这个变量名在栈的本地变量数组中,1这个值是直接引用方法区常量池中的值
第二个问题是,a中存的是1这个字面值,因为执行了int a = 1这个赋值操作

flonny
精锐小菜鸡 回复u011059021: 还有一点,一个线程中每次调用一个方法就有一个栈帧,而每个栈帧中也有不同的区域,我之前说a这个变量和压入的字面值都放在栈的本地变量数组中是不对的,a这个变量是放在本地变量数组中的,而压入的字面值是在操作数栈中的,可以参考博文:https://blog.csdn.net/zhoudaxia/article/details/26454421/
一年多之前 回复
flonny
精锐小菜鸡 回复u011059021: 纠正一下 1:istore_1这个操作其实就是赋值操作,是把上一步压入的字面值存到1这个标号中,而1标号指向的是a这个空间,具体你可以自己去javap反编译一下
一年多之前 回复
u011059021
KK_在努力 回复flonny: 谢谢。采纳你的回答。没想到一个简单的问题,多年的老程序员们居然回答的还不一致。
一年多之前 回复
flonny
精锐小菜鸡 回复u011059021: 然后回答你的问题,不管用的字面值是否在常量池中有存在,都存在入栈操作,然后在赋值,也就是说栈中必须有一块区域存放字面值,还有a这个空间,a经过赋值操作后存放的就是字面值本身。其java的汇编代码是:0: iconst_1(压入1常量)、 1: istore_1(存放a变量到1,1只是一个标号,不需要在意)
一年多之前 回复
flonny
精锐小菜鸡 回复u011059021: 我刚刚去看了一下jdk1.8的汇编,发现之前说的整数常量范围在栈操作中不是-128~127,因为压栈操作中的int类型常量入栈只有0~5,具体可以参考https://blog.csdn.net/lisulong1/article/details/53001211
一年多之前 回复
u011059021
KK_在努力 回复flonny: 如果是129,那么在栈里先存储a这个变量名,然后再存储一个129。最后赋值是把129放到a的空间,还是放129的地址?
一年多之前 回复
flonny
精锐小菜鸡 回复u011059021: 等于右边的1也是需要占用空间的,a中存的1这个值是在赋值操作之后才有的,那么1是怎么来的,是从常量池中拿出来赋值给a这个变量的,如果赋值的不是1而是-128~127以外的整数,那么jvm会在栈的本地变量数组中创建一个内存空间存放这个字面值,然后在进行赋值操作,通俗讲等于号左边的变量名和等于号右边的字面值是两个东西,都是需要有地方存储的
一年多之前 回复
u011059021
KK_在努力 这不是矛盾了吗?你都说了a中存的是1的值,然后上面又说是直接引用常量池中的值
一年多之前 回复

如果是写在函数里的,那么a放在堆栈上。存储的就是值。
Integer(1)放在常量池中

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复u011059021: 是的。
一年多之前 回复
u011059021
KK_在努力 回复caozhy: 回到问题本身,存在栈中,栈中a应该存的是值1本身。把分给你吧
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 我刚学编程的时候,用的是和apple ii兼容的中华学习机,rom basic,后来用了pc,gw-basic。这两种语言都不支持堆栈,虽然gwbasic已经有了go sub这样的语句。
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复u011059021: 那个时候java还没有呢。java 1995年才有的吧。
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复u011059021: 就是叫堆栈,我上小学的时候就是这么叫了。(大概1990年代)
一年多之前 回复
u011059021
KK_在努力 回复caozhy: 不是,堆栈我觉得是说堆或者栈
一年多之前 回复
u011059021
KK_在努力 回复caozhy: 堆栈是<编程思想>的中文版里翻译的吧,其他地方都是栈吧
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复u011059021: 你是不是认为堆栈是指堆上的栈?而引起误会。好比老师必须要说师,否则会理解为年老的老师?哈哈。堆栈就是一个固定的名词。
一年多之前 回复
flonny
精锐小菜鸡 回复u011059021: 他说的没错,stack可以叫栈也可以叫堆栈,你可以百度一下
一年多之前 回复
u011059021
KK_在努力 回复caozhy: 我的意思是 stack指的是栈,heap值得是是堆。就像说 teacher(老师)一样
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复u011059021: stack就是堆栈,不存在“stack栈”,好比heap就是堆,不能说heap堆。
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复u011059021: 你的问题我已经回答了,既然是基本类型,就没有“指向的值”一说,只有对象引用才有。
一年多之前 回复
u011059021
KK_在努力 回复caozhy: 你说的我知道,我问的是题目上的情况。并且最好不要说堆栈(应该是想说stack栈吧),以免误导。
一年多之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复u011059021: 对。Person p = new Person(); // p是一个引用,在堆栈上,指向的对象(new Person)在堆上。
一年多之前 回复
u011059021
KK_在努力 new出来的对象应该放在堆中吧
一年多之前 回复

首先明确a是int类型,基本类型,所以问题2的答案很明显,a中存的是1的值,因为是局部变量,所以是在a和1均在方法区中

u011059021
KK_在努力 你在瞎说。局部变量存在栈中。类中常量和静态变量等放在常量池中。第二个问题也不对
一年多之前 回复

问题二 a存的值是1,但他的内存地址指向常量池1,

1.a是变量,所以方法执行的时候a和它的值在栈中,方法执行完后a就销毁了
2.a中存的是1的值。

局部变量存在栈中。类中常量和静态变量等放在常量池中。

栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)

这个问题我想再补充下。
lz陷入一种悖论中。因为不知道,所以要提问,然后面对各种矛盾的回答,你不知道相信谁。最后,你还是不知道。
这种情况下,lz无非两个选择:
(1)采用“投票”的方式,看哪种说法的回答多,就相信谁。
大部分的人为什么永远没有办法进步就是在于此,一方面他想从菜鸟的群体中脱离出来,另一方面他只接受菜鸟中大多数人的意见。并且顽固地认为这才是正确的认知方式。
(2)加上自己的思考、判断和求证。
求证的方式很简单,只要按照你的要求写个程序,反编译下java字节码,然后你就看到结论了。这是解决问题的终极方式。这个问题可以这么解决。
思考和判断是更进阶的方式。
可以教你一个简单的思想方法,我们把它叫做"奥卡姆剃刀原理"。简单来说就是八个字,如无必要,勿增实体。如果有两个理论都可以解释同一个事物,那么简单的那个取胜。
运用这个原理,你可以把自己想象成java语言的发明者和jvm的设计者。然后倒推这个问题。
为什么java要分为什么常量、简单类型、引用类型等等,显然java并非是为了考试和刁难它的使用者而徒增这些概念的。唯一的动机就是增加复杂性换取性能。那么如果不换取性能,最简单的方式是什么呢,显然就是一切变量都是引用类型,这是最简单的。一个引用类型可以概括java里所有的东西。
那么简单类型和常量是什么,它是特例。用特例换取性能。对于整数来说,它频繁参与到计算中,如果用定义一个类,并且使用一个指针的方式来使用它,就会浪费很多性能。所以才有了简单类型。而常量是怎么回事?它是对大量重复使用的引用类型的一种性能优化,用共享对象的方式,来将大量相同的对象合并存储唯一的一份。搞清楚了这些,再回过头来看你的问题,就很简单了。

zhuanpenglve0711
木心__ 听君一席话,胜读十年书。
大约一年之前 回复
flonny
精锐小菜鸡 我是站在你这队的,只是解释为什么是这样的结果o.o
一年多之前 回复

楼主弄明白了嘛 最近复习的时候也遇到了这个问题 现在的理解是 int a 这个a变量存在栈中 但是这个代表值的1不知道是怎么算的 假如有个int b =1 那这俩个1在实际内存中的地址不知道是不是一致的 望解答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java 局部变量与全局变量问题
-
java内部类中的局部变量
-
Java局部变量全局变量递归问题
-
Java 内存区域中关于局部变量的值的存放位置
-
Java实现1-100的完全数,为什么变量申明为成员变量没结果,为局部变量就有结果。
-
求大神帮忙看下关于java局部变量未初始化的问题
-
lua中全局变量,局部变量和非局部变量分别放在什么容器中?
-
java局部变量问题求助,急!!!
-
java 提取变量名中的数字 比如说变量a1,a2,a3 我如何用一个int来接收1,2,3
-
JAVA的成员变量和局部变量
-
java局部变量问题求解答
-
函数局部变量在函数退出后释放
-
JAVA中的成员变量和局部变量的位置
-
内部变量和外部变量就是局部变量和全局变量吗?
-
java中基本类型都是存放在局部变量表中的吗
-
java 变量在堆栈内存的问题
-
java局部变量的作用范围?
-
C中什么情况下把局部变量定义为局部静态变量
-
如何区分成员变量和局部变量
-
Linux文件操作高频使用命令
文章目录0.新建操作:1.查看操作2.删除操作3.复制操作4.移动操作:5.重命名操作:6.解压压缩操作 0.新建操作: mkdir abc #新建一个文件夹 touch abc.sh #新建一个文件 1.查看操作 查看目录: ll #显示目录文件详细信息 查看文件内容: cat|head|tail命令 cat abc.txt #查看abc的内容 head -5 abc.txt #...
程序员实用工具网站
目录 1、搜索引擎 2、PPT 3、图片操作 4、文件共享 5、应届生招聘 6、程序员面试题库 7、办公、开发软件 8、高清图片、视频素材网站 9、项目开源 10、在线工具宝典大全 程序员开发需要具备良好的信息检索能力,为了备忘(收藏夹真是满了),将开发过程中常用的网站进行整理。 1、搜索引擎 1.1、秘迹搜索 一款无敌有良心、无敌安全的搜索引擎,不会收集私人信息,保...
LeetCode解题汇总目录
此篇为LeetCode刷题的汇总目录,方便大家查找,一起刷题,一起PK交流! 已解题目 考点 LeetCode 1. 两数之和(哈希) LeetCode 2. 两数相加(单链表反转) LeetCode 9. 回文数 LeetCode 11. 盛最多水的容器(双指针) LeetCode 15. 三数之和 LeetCode 17. 电话号码的字母组合(回溯...
全球最厉害的 14 位程序员!
来源 | ITWorld 整理自网络全球最厉害的 14 位程序员是谁?今天就让我们一起来了解一下吧,排名不分先后。01. Jon Skeet个人名望:程序技术问答网站 S...
从入门到精通,Java学习路线导航
引言 最近也有很多人来向我"请教",他们大都是一些刚入门的新手,还不了解这个行业,也不知道从何学起,开始的时候非常迷茫,实在是每天回复很多人也很麻烦,所以在这里统一作个回复吧。 Java学习路线 当然,这里我只是说Java学习路线,因为自己就是学Java的,对Java理当很熟悉,对于其它方面,我也不是很了解。 基础阶段 首先是基础阶段,在基础阶段,我们必须掌握Java基础,Mysql数据库,Ora...
二十出头,老气横秋
有的时候,我们希望年轻人成熟一点,不要巨婴,不要总是等着别人来解救,要自立,要有担当。但有时候吧,发现有些年轻人,似乎过于成熟了,二十来岁的人,感觉怎么就老气横秋的。1、...
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
五分钟小知识:为什么说 ++i 的效率比 i++ 高?
点击蓝色“五分钟学算法”关注我哟加个“星标”,天天中午 12:15,一起学算法作者 | 守望先生来源 | 编程珠玑前言不知道你是否听说过 ++i 比 i++ 快的说法,真...
什么是大公司病(太形象了)
点击蓝色“五分钟学算法”关注我哟加个“星标”,天天中午 12:15,一起学算法作者 | 南之鱼来源 | 芝麻观点(chinamkt)所谓大企业病,一般都具有机构臃肿、多重...
代码整洁 vs 代码肮脏
写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。 WTF/min是衡量代码质量的唯一标准,Uncle Bob在书中称糟糕的代码为沼泽(wading),这只突出了我们是糟糕代码的受害者。国内有一个更适合的词汇:屎山,虽然不是很文雅但是更加客观,程序员既是受害者也是加害者。 对...
让程序员崩溃的瞬间(非程序员勿入)
今天给大家带来点快乐,程序员才能看懂。 来源:https://zhuanlan.zhihu.com/p/47066521 1. 公司实习生找 Bug 2.在调试时,将断点设置在错误的位置 3.当我有一个很棒的调试想法时 4.偶然间看到自己多年前写的代码 5.当我第一次启动我的单元测试时 ...
Git 天天用 但是 Git 原理你了解吗?
Git 原理 做技术一定要知其然知其所以然,意思就是:知道它是这样的,更知道它为什么是这样的。我主要通过4块内容来简单介绍 Git 是原理是什么样的。这4块内容如下: Git 存储目录结构介绍 Git 是如何存储的 Git 的对象 Git引用 当然 Git 原理不仅仅包含这些,想要更深入了解请查看官方教程 https://git-scm.com/book/zh/v2/。 本文内容是我在 Git...
为什么面向对象糟透了?
又是周末,编程语言“三巨头”Java, Lisp 和C语言在Hello World咖啡馆聚会。服务员送来咖啡的同时还带来了一张今天的报纸, 三人寒暄了几句, C语言翻开了...
Java 每日算法,三个线程按顺序打印
关于多线程的基础知识,可点击下面链接进行学习。 JAVA\Android 多线程实现方式及并发与同步 题目1 启动3个线程A、B、C,使A打印0,然后B打印1,然后C打印2,A打印3,B打印4,C打印5,依次类推。 public class PrintSequenceThread implements Runnable { private static final Ob...
分享靠写代码赚钱的一些门路
作者 mezod,译者 josephchang10如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。今天给大家分享一个精彩...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
技术人员要拿百万年薪,必须要经历这9个段位
很多人都问,技术人员如何成长,每个阶段又是怎样的,如何才能走出当前的迷茫,实现自我的突破。所以我结合我自己10多年的从业经验,总结了技术人员成长的9个段位,希望对大家的职...
8000字干货:那些很厉害的人是怎么构建知识体系的
本文约8000字,正常阅读需要15~20分钟。读完本文可以获得如下收益: 分辨知识和知识体系的差别 理解如何用八大问发现知识的连接点; 掌握致用类知识体系的构建方法; 能够应用甜蜜区模型找到特定领域来构建知识体系。 1. 知识体系?有必要吗? 小张准备通过跑步锻炼身体,可因为之前听说过小腿变粗、膝盖受伤、猝死等等与跑步有关的意外状况,有点担心自己会掉进各种坑里,就在微信上问朋友圈一直晒跑步...
nginx学习,看这一篇就够了:下载、安装。使用:正向代理、反向代理、负载均衡。常用命令和配置文件
文章目录前言一、nginx简介1. 什么是 nginx 和可以做什么事情2.Nginx 作为 web 服务器3. 正向代理4. 反向代理5. 动静分离6.动静分离二、Nginx 的安装三、 Nginx 的常用命令和配置文件四、 Nginx 配置实例 1 反向代理五、 Nginx 配置实例 2 负载均衡六、 Nginx 配置实例 3 动静分离七、 Nginx 的高可用集群 前言 一、nginx简介...
500行代码,教你用python写个微信飞机大战
这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右手有节奏有韵律的朝着同一个方向来回移动起来! 这是史诗级的发明,是浓墨重彩的一笔,是…… 在一阵抽搐后,我结束了游戏,瞬时觉得一切都索然无味,正在我进入贤者模式时,突然想到,如果我可以让更多人已不同的方式体会到这种美轮美奂的感觉岂不美哉? 所以我打开电脑,创建了一个 `plan_game.py`……
2019诺贝尔经济学奖得主:贫穷的本质是什么?
2019年诺贝尔经济学奖,颁给了来自麻省理工学院的 阿巴希·巴纳吉(Abhijit Vinayak Banerjee)、艾丝特·杜芙若(Esther Duflo)夫妇和哈...
相关热词 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天 c#func链接匿名方法 c#怎么创建文件夹 c#从键盘接收空格 c#da/ad c#部门请假管理系统 c#服务器socket c# 默认的访问修饰符