我想知道Java中,String pool是存在什么地方的?数据区?还是堆或者栈上?
另外,局部变量存在栈上,那如果我吧一个对象以参数形式传递给一个方法,那么不就是值传递了?不是引用传递了?
小弟在此不胜感激!

解决方案 »

  1.   

    Sun的JVM,interned字符串是被放置在RAM的一个特殊的池中叫作perm gen方法参数本来就是值传递,传的是引用的拷贝
      

  2.   

    又是这种问题!存在栈上、存在堆上与编制程序的影响大么?PS:建议把 Thinking in Java 这书扔了或者送人。
      

  3.   

    你只需知道String有个常量池就足够了,至于存在哪里,不同公司的jdk实现可能不同,IBM的jdk和Sun的jdk兴许就不同
      

  4.   

    String pool的位置一楼较为准确,对象作为参数传递时,传递是一个引用,而不是对象本身。
      

  5.   

    把对象以参数形式传递给方法时
    是把对象的引用的值传过去的
    即 传进去的是 对象在堆中的地址
    所以java里有“不能改变参数的值,只能改变参数的属性值”一说
    java里没有引用传递
      

  6.   

    强烈建议,学习java一年甚至2年后再读thinking in java.
      

  7.   

    JVM会为每一个加载的class建立一个叫做“方法区”的运行时内存空间。每个类的常量池以特有的数据结构(不同JVM实现的形式不同)存放在对应的方法区中。另外,JVM的每个线程都有自己的Java栈,当线程调用某一个方法时就会创建一个"栈帧"压入Java栈中。栈帧中就有局部变量区和操作数栈,因此方法见参数传递,实际上是从某一个栈帧的局部变量区中取出值存放在新堆入的栈帧的局部变量区中。也就是“值传递”。PS1: 《Thinking in Java》并不适合初学者,而且太啰嗦了。它恨不得把J2SE的所有技术(包括JVM)都写进去。搞得读起来很伤心。ps2:  我个人很反对两个计算机术语:值传递call by value,引用传递 call by reference。这两名字取得太烂了。应该叫做“相同内存空间的值传递”和“不同内存空间的值传递”,这样就恰当些。
      

  8.   

    ls,传递严格来说应该是pass by XXX,还有不同内存空间是什么?
      

  9.   

    实参和形参是否都是同一块内存区域。比如C++中的"别名"传递就是指引用传递,而C++的指针以及Java的引用都是值传递。我个人感觉很多人误认为引用传递是指传递“地址”,都是因为这个叫做“call by reference”的名字造成的。http://hxraid.javaeye.com/blog/428856