黑马程序员技术交流社区

标题: 关于内存分布 [打印本页]

作者: 李敬卫    时间: 2012-12-27 22:05
标题: 关于内存分布
很迷茫,局部变量是在栈内存中,成员变量也是在栈内存中吗?String s="abc",那"abc"这个对象是在那个内存中,回答这个问题前请您先思考好。我会有疑问的
作者: 冯伟超    时间: 2012-12-27 22:31
String s="abc"
String s是引用对象 在栈中,abc是在方法区中的长量池中。
一般new 出来的实例是在堆内存中,直接赋值的一般是在方法区中的常量池里
还有基本数据类型是在栈中进行运算的,不涉及到堆里!
作者: 李敬卫    时间: 2012-12-27 23:02
当类加载的时候,成员变量是在那里分布?如int x=1定义在成员位置上
作者: 李敬卫    时间: 2012-12-27 23:05
当类加载的时候,成员变量是在那里分布?如int x=1定义在成员位置上
作者: 顾亦飞    时间: 2012-12-28 02:38
         成员变量是放在栈内存中,String s = "abc" 这里的abc因当在堆内存的字符串池中,注意,abc一旦new出,那么就不会再改变,java对String做了相应的优化,比如:String s1= "abc" -->String s2 = "abc" 那么这时,堆内存中只会存在一个abc对象,因为s2和s1指向的是同一个对象...java会尽量的对字符串的优化.(因为字符串是不可以变的对象,重有不会带来任何问题 )比如你再s = "abc"+"def"那么这时虚拟机会再给你创建一个abcdef对象出来,这时s所以指向的就是"abcdef"这个对象的引用了,
          String内部用到的"+"号,他重载了系统的"+" 他之所以会把字符串相加,是因为String里的"+"内部,用到的是StringBuilder的append方法做的相加.如果在做大量的字符串相加时最好用StringBuilder他的速度更快.特别是在for循环下禁用String对字符串相加,这样会产生好多垃圾出来.





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2