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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 游灿平 中级黑马   /  2013-2-24 19:26  /  1958 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s = "a"+"b"+"c"+"d"+"e";
在内存中创建了几个对象啊?

7 个回复

倒序浏览
貌似这个问题前几天刚有人问
5个,6个,9个都有人说
不过有个人说是一个
因为这个句话编译后就成了String s="abcde";
我挺赞同的
回复 使用道具 举报
本帖最后由 司懿卓 于 2013-2-24 19:42 编辑

应该是创建了两个
一个是常量池里的字符串
一个是s引用的字符串..  

String 是常量.. 或者应该说字符串是常量,只是String的引用在变.
回复 使用道具 举报
应该是存在几个变量吧.没有new的话就数.有new的话就加一个 5个.
你可能认为String s也算一个,String s是在栈中建立了一个String对象引用变量s,他不算一个对象.只是一个引用变量.而"abc"是一个String的对象.
String 类刚开始的时候就说过了
String str="abc";//一个对象
String str=new String("abc")//两个对象
回复 使用道具 举报
创建了0个或1个对象

在编译的时候,编译器已经做了优化,变成了
String s = "abcde";

在执行时,如果常量池中已有"abcde",则不会创建对象
如果没有,就创建一个对象
回复 使用道具 举报
答曰:楼上说的好!
回复 使用道具 举报
张宁 中级黑马 2013-2-25 15:40:53
7#
创建了一个 。我就不浪费感情了。。他等于 String s = "abcde";
回复 使用道具 举报
何伟 中级黑马 2013-2-25 20:22:40
8#
其实就创建了一个
赋值符号右边的"a"、"b"、"c"、"d"、"e"都是常量
对于常量,常量编译时就直接存储它们的值而不是它们的引用
在编译时就直接把它们连接的结果算出来变成了"abcde"
该语句在class文件中就相当于String s = "abcde"
虚拟机执行的时候直接创建一个String s="abcde"
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马