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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张峰 黑马帝   /  2011-11-29 21:08  /  2798 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张峰 于 2011-11-30 13:13 编辑

String s = new String("abc"),这里是创建了2个String Object    为什么是两个?

11 个回复

倒序浏览
刘涛 黑马帝 2011-11-29 21:28:06
沙发
new这个关键字 ,首先开辟了一个内存空间,
所以就是两个了。
例如 :
    MyDate myBirthday;
   myBirthday = new MyDate ;
在可以使用变量之前,实际内存必须被分配,
这个工作就是通过new关键字实现的 ,
new 意味着内存的分配和初始化。

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
刘旭 黑马帝 2011-11-29 22:33:51
藤椅
当编译时new String("abc")时,jvm先在字符串池中创建字符串“abc”(假如字符串池中还没有字符串“abc”),此为一个字符串对象。然后,再根据这个字符串池中的字符串创建一个新的字符串对象“abc”,此为第二个字符串对象,并将它赋值给给s。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
强子 黑马帝 2011-11-29 22:37:58
板凳
认为藤椅正解
回复 使用道具 举报
首先你要理解constant pool, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。   
如果你用了String s = new String("abc");  那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的"abc"被作为常量读入,在常量池里创建了一个共享的"abc"    然后,当调用到new String("abc")的时候,会在堆内存里创建这个new String("abc");  
回复 使用道具 举报
首先你要理解常量池, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。   
如果你用了String s = new String("abc");   那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的"abc"被作为常量读入,在常量池里创建了一个共享的"abc"    然后,当调用到new String("abc")的时候,会在堆内存里创建这个new String("abc");   
回复 使用道具 举报
xiaolij3s 黑马帝 2011-11-30 11:14:58
7#
首先你要理解常量池, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。   
如果你用了String s = new String("abc");   那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的"abc"被作为常量读入,在常量池里创建了一个共享的"abc"    然后,当调用到new String("abc")的时候,会在堆内存里创建这个new String("abc");   
回复 使用道具 举报
xiaolij3s 黑马帝 2011-11-30 11:15:36
8#
首先你要理解常量池, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。   
如果你用了String s = new String("abc");   那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的"abc"被作为常量读入,在常量池里创建了一个共享的"abc"    然后,当调用到new String("abc")的时候,会在堆内存里创建这个new String("abc");   
回复 使用道具 举报
xiaolij3s 黑马帝 2011-11-30 11:45:33
9#
首先你要理解常量池, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。   
  如果你用了String s = new String("abc");   
  那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的"abc"被作为常量读入,在常量池里创建了一个共享的"abc"   
  然后,当调用到new String("abc")的时候,会在堆内存里创建这个new String("abc");   
回复 使用道具 举报
如果是String s = "sbc"
先看常量池中有没有"abc"    再创建  将常量放入常量池

而String s=new String("abc");
创建的字符串不是常量   所以是直接放在在堆中
回复 使用道具 举报
xiaolij3s 黑马帝 2011-11-30 12:38:20
11#
首先你要理解常量池, 这是一个特殊的共享区域,literate, Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。   
  如果你用了String s = new String("abc");   
  那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的"abc"被作为常量读入,在常量池里创建了一个共享的"abc"   
  然后,当调用到new String("abc")的时候,会在堆里里创建这个new String("abc");   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马