黑马程序员技术交流社区

标题: 关于Java内存分配空间问题 [打印本页]

作者: liujie445012100    时间: 2014-6-14 00:14
标题: 关于Java内存分配空间问题
Java中的static变量和静态方法和普通方法都存放在方法区是吗?
String s = new String("abc");
new是一个新的字符串对象,内容是"abc",s指向对象存放在堆中的"abc"是吗?
那怎么有人说new是一个对象,"abc"存储在字符串常量池中呢?
==明明不相等啊!
作者: 会说话的木头    时间: 2014-6-14 00:25
对            
作者: 不去会死    时间: 2014-6-14 08:21
坐等高人回答,顺便水一下黑币
作者: 123_yaya    时间: 2014-6-14 10:07
  1.        
  2.         public static void main(String[] args) {
  3.                 String str=new String("abc");
  4.                 String str2="abc";
  5.                 String str3="abc";
  6.                 System.out.println(str==str2);//false
  7.                 System.out.println(str2==str3);//true
  8.                
  9.                 Integer i=12;
  10.                 Integer i1=12;
  11.                 System.out.println(i==i1);//true
  12.                
  13.                 Integer i2=new Integer(12);
  14.                 Integer i3=new Integer(12);
  15.                 System.out.println(i2==i3);//false
  16.                 System.out.println(i==i2);//false
  17.                
  18.                 //-128-127
  19.                 Integer i4=128;
  20.                 Integer i5=128;
  21.                 System.out.println(i4==i5);//false
  22.                
  23.         }
复制代码

我的理解是:
凡是new 都是在栈中创建一个指针指向堆。栈中存放的是指向堆的地址。堆中是开辟一块空间,存放内容。
至于常量池,是要看那些数据类型或者包装类实现了常量池的技术。java中Integer包装类和String是实现了包装类技术的。只有写成 String="",或者Integer=""的模式才代表了使用到了常量池。如代码所示,String类型的,str2在常量池中创建了"abc",str3在常量池中发现str2创建了“abc",就不再新创建了一个”abc",所以str2==str3的。同理Integer i=12,在常量池中创建了12,i1检测到了有i2就不再创建了。但是Integer包装类实现的常量池技术有个特点是,在-127~128的范围内才实现常量池技术,超过了这个范围,是相当于new Integer()的了。
作者: 123_yaya    时间: 2014-6-14 10:18
另外,楼主要知道其实常量池就是存放在堆中的,只不过是堆中的一块特殊地方。画一个图理解一下。楼主可以参考一下。C:\Users\ASUS\Desktop\内存栈堆常量池.png
作者: 123_yaya    时间: 2014-6-14 10:19

作者: 黄宝宝    时间: 2014-6-14 10:30
String s = new String("abc"),其实是创建了两个对象!
作者: 华子    时间: 2014-6-14 10:38
伙同哪位水黑马币的来了




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