A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敬卫 中级黑马   /  2012-12-27 22:05  /  1273 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

很迷茫,局部变量是在栈内存中,成员变量也是在栈内存中吗?String s="abc",那"abc"这个对象是在那个内存中,回答这个问题前请您先思考好。我会有疑问的

4 个回复

倒序浏览
String s="abc"
String s是引用对象 在栈中,abc是在方法区中的长量池中。
一般new 出来的实例是在堆内存中,直接赋值的一般是在方法区中的常量池里
还有基本数据类型是在栈中进行运算的,不涉及到堆里!
回复 使用道具 举报
李敬卫 来自手机 中级黑马 2012-12-27 23:02:01
藤椅
当类加载的时候,成员变量是在那里分布?如int x=1定义在成员位置上
回复 使用道具 举报
李敬卫 来自手机 中级黑马 2012-12-27 23:05:05
板凳
当类加载的时候,成员变量是在那里分布?如int x=1定义在成员位置上
回复 使用道具 举报
         成员变量是放在栈内存中,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对字符串相加,这样会产生好多垃圾出来.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马