String s=new String("ab")+"c";这条语句总共建了几个对象,在堆和池中的结构是什么样的?
解决方案 »
- map中是传值还是引用
- Swing里的输入框怎么让它变成密码的输入框
- java程序与SQL server 2005 连接不上,为什么???该配置的都配置了!!!
- 请问:如何查看栈内存和堆内存中的数据??就是如何通过某种方法看看这个数据是在堆中还是栈中?
- 我用JBuilder2006加载Servlet时,出错了java.lang.ClassNotFoundException: myservlet.UserallServlet,请问,各位大虾,这个时什么原因
- jtds为何不能用?
- javac指令的-sourcepath 和 java指令的-cp 怎么给定啊???
- 输入数值要求计算后输出问题
- 关于java的菜鸟问题(高分送!)
- java菜菜鸟提问之二:我想下载个jbuilder,哪儿有,我找到的都没序列号。
- 新手~一个计算某日是星期几的函数~请大家帮忙改进改进~
- byte类型移位相或数据丢失
String s=new String("ab")+"c";
首先在编译期创建一个常量对象C ,存放在常量池中;再创建一个常量对象ab,存放在常量池中,再创建一个String类型的引用,存放在栈中(引用不是对象)
然后运行期动态的把常量对象ab传递给String类的构造器,创建一个String类型的对象;
接着就是把两个对象进行相加
相加过程中,由于String是不可变的,所以要创建一个StringBuffer对象,然后把String类型的对象装入StringBuffer中 然后用append(c);就像是下面的例子:
String k=new String("ab");
StringBuffer m=new StringBuffer(k);
m.append("c");
String s=m.toString();
就这样生成了S;
综上所述:创建的对象有:常量对象ab; 常量对象c;String类型的对象(即用构造器实例化的那个对象);
StringBuffer对象 共4个对象
这也就体现了String的缺点,对字符串相加相率极低 尽量用StringBuffer;
池中:"ab" "c"
池中:"ab" "c"
4个String对象是常量池中3个:ab,b,abc,堆对象ab
"ab"+"c"这样子写 "abc"才会被建在池中,除此以外,都是在堆中。
string "c"
string "abc"
[color=#0000FF]new String("ab")这个语句产生了两个对象,即 池中"ab" 堆中"ab"
"c"产生了一个对象,即 池中:"c"
再将他们相加,会产生一个对象:即 堆中:"abc"[/color]