黑马程序员技术交流社区
标题:
关于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
public static void main(String[] args) {
String str=new String("abc");
String str2="abc";
String str3="abc";
System.out.println(str==str2);//false
System.out.println(str2==str3);//true
Integer i=12;
Integer i1=12;
System.out.println(i==i1);//true
Integer i2=new Integer(12);
Integer i3=new Integer(12);
System.out.println(i2==i3);//false
System.out.println(i==i2);//false
//-128-127
Integer i4=128;
Integer i5=128;
System.out.println(i4==i5);//false
}
复制代码
我的理解是:
凡是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
内存栈堆常量池.png
(95.56 KB, 下载次数: 13)
下载附件
2014-6-14 10:18 上传
作者:
黄宝宝
时间:
2014-6-14 10:30
String s = new String("abc"),其实是创建了两个对象!
作者:
华子
时间:
2014-6-14 10:38
伙同哪位水黑马币的来了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2