求高手回答

liyu1006 2010-06-27 09:22:16
我想知道Java中,String pool是存在什么地方的?数据区?还是堆或者栈上?
另外,局部变量存在栈上,那如果我吧一个对象以参数形式传递给一个方法,那么不就是值传递了?不是引用传递了?
小弟在此不胜感激!
...全文
140 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
WYhack 2010-06-29
  • 打赏
  • 举报
回复
更加迷惑@1
dracularking 2010-06-29
  • 打赏
  • 举报
回复
是的,传参时不管是基础类型还是引用类型都是将值传给了它们的拷贝
heartraid86 2010-06-29
  • 打赏
  • 举报
回复
实参和形参是否都是同一块内存区域。比如C++中的"别名"传递就是指引用传递,而C++的指针以及Java的引用都是值传递。

我个人感觉很多人误认为引用传递是指传递“地址”,都是因为这个叫做“call by reference”的名字造成的。

http://hxraid.javaeye.com/blog/428856
fantasy471503202 2010-06-28
  • 打赏
  • 举报
回复
String pool的位置一楼较为准确,对象作为参数传递时,传递是一个引用,而不是对象本身。
dracularking 2010-06-28
  • 打赏
  • 举报
回复
还有相同内存空间是什么
dracularking 2010-06-28
  • 打赏
  • 举报
回复
ls,传递严格来说应该是pass by XXX,还有不同内存空间是什么?
c15852462458 2010-06-28
  • 打赏
  • 举报
回复
heartraid86 2010-06-28
  • 打赏
  • 举报
回复
JVM会为每一个加载的class建立一个叫做“方法区”的运行时内存空间。每个类的常量池以特有的数据结构(不同JVM实现的形式不同)存放在对应的方法区中。

另外,JVM的每个线程都有自己的Java栈,当线程调用某一个方法时就会创建一个"栈帧"压入Java栈中。栈帧中就有局部变量区和操作数栈,因此方法见参数传递,实际上是从某一个栈帧的局部变量区中取出值存放在新堆入的栈帧的局部变量区中。也就是“值传递”。

PS1: 《Thinking in Java》并不适合初学者,而且太啰嗦了。它恨不得把J2SE的所有技术(包括JVM)都写进去。搞得读起来很伤心。

ps2: 我个人很反对两个计算机术语:值传递call by value,引用传递 call by reference。这两名字取得太烂了。应该叫做“相同内存空间的值传递”和“不同内存空间的值传递”,这样就恰当些。
dr_lou 2010-06-28
  • 打赏
  • 举报
回复
强烈建议,学习java一年甚至2年后再读thinking in java.
keeya0416 2010-06-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 liyu1006 的回复:]
我想知道Java中,String pool是存在什么地方的?数据区?还是堆或者栈上?
另外,局部变量存在栈上,那如果我吧一个对象以参数形式传递给一个方法,那么不就是值传递了?不是引用传递了?
小弟在此不胜感激!
[/Quote]
把对象以参数形式传递给方法时
是把对象的引用的值传过去的
即 传进去的是 对象在堆中的地址
所以java里有“不能改变参数的值,只能改变参数的属性值”一说
java里没有引用传递
龙四 2010-06-27
  • 打赏
  • 举报
回复
你只需知道String有个常量池就足够了,至于存在哪里,不同公司的jdk实现可能不同,IBM的jdk和Sun的jdk兴许就不同
  • 打赏
  • 举报
回复
又是这种问题!存在栈上、存在堆上与编制程序的影响大么?

PS:建议把 Thinking in Java 这书扔了或者送人。
dracularking 2010-06-27
  • 打赏
  • 举报
回复
Sun的JVM,interned字符串是被放置在RAM的一个特殊的池中叫作perm gen

方法参数本来就是值传递,传的是引用的拷贝

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧