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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© liujie445012100 中级黑马   /  2014-6-14 00:14  /  1115 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java中的static变量和静态方法和普通方法都存放在方法区是吗?
String s = new String("abc");
new是一个新的字符串对象,内容是"abc",s指向对象存放在堆中的"abc"是吗?
那怎么有人说new是一个对象,"abc"存储在字符串常量池中呢?
==明明不相等啊!

8 个回复

倒序浏览
对            
回复 使用道具 举报
坐等高人回答,顺便水一下黑币
回复 使用道具 举报
  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()的了。
回复 使用道具 举报
另外,楼主要知道其实常量池就是存放在堆中的,只不过是堆中的一块特殊地方。画一个图理解一下。楼主可以参考一下。C:\Users\ASUS\Desktop\内存栈堆常量池.png

点评

第一次放图片,放错了。楼下补贴。  发表于 2014-6-14 10:20
回复 使用道具 举报
回复 使用道具 举报
String s = new String("abc"),其实是创建了两个对象!
回复 使用道具 举报
华子 中级黑马 2014-6-14 10:38:32
8#
伙同哪位水黑马币的来了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马