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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿旺 中级黑马   /  2014-4-24 15:47  /  1743 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 阿旺 于 2014-4-25 09:18 编辑

String  s = new String("abcd");
这语句创建了多少个String对象?是一个还是两个,请教大家,分析一下,谢谢

点评

认真看毕老师视频.里面有详解!!!  发表于 2014-4-24 21:59

7 个回复

倒序浏览
String  s = new String("abcd");
在内存中创建了2个对象.一个在常量池,另一个在堆内存中
首先在栈内存中有一个变量s引用指向堆内存的new String()对象
而堆内存的new String 记录的是在常量池中的abcd的地址

回复 使用道具 举报 1 0
两个 常量池里的“abcd”和堆内存里的String
回复 使用道具 举报 1 0
是两个,String类本来就是final类,当它在创建对象时,它先在常量池里创建这个字符串的一个对象,又因为它是使用了new关键字,所以呢它又会在堆内存中存一个new String()对象.实际上它和String str=“abcd”;的区别就在此处,一个是会创建两个对象,常量池一个,堆内存一个。另一个会创建一个对象,只有常量池中的一个。根据那个new关键字进行思考和记忆,就OK了,希望能帮到你。。。
回复 使用道具 举报
我们常用的创建一个类的实例(对象)的方法有以下两种:

一、使用new创建对象。  

二、调用Class类的newInstance方法,利用反射机制创建对象。

我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了s变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abcd"。由此我们又要引入另外一种创建String对象的方式的讨论——引号内包含文本
回复 使用道具 举报 1 0

String  s = new String("abcd");创建了两个对象,new出一个对象,“abcd”也是一个对象,这个对象放在常量池中。
String s = “abcd”;这个是创建了一个对象。
回复 使用道具 举报
String 字符串 = "字符串内容";
使用了缓冲池机制,在内存中只开辟了一个内存空间
String 字符串 = new String("字符串内容");
没有使用缓冲池机制,在内存中开辟了两个内存空间


String s = “aaa”;(采用字面值方式赋值)
1)  查找 String Pool(字符串池)中是否存在“aaa”这个对象,如果不存在,则在 String Pool 中创建
一个“aaa”对象,然后将 String  Pool 中的这个“aaa”对象的地址返回来,赋给引
用变量s,这样s会指向String Pool中的这个“aaa”字符串对象
2)  如果存在,则不创建任何对象,直接将 String Pool中的这个“aaa”对象地址返回来,
赋给 s 引用。
String s = new String(“aaa”);
1)  首先在String Pool 中查找有没有“aaa”这个字符串对象,如果有,则不在 String Pool
中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对
象,然后将堆中的这个“aaa”对象的地址返回来,赋给 s 引用,导致 s 指向了堆中
创建的这个“aaa”字符串对象。
2)  如果没有,则首先在 String Pool中创建一个“aaa“对象,然后再在堆中(heap)创
建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给 s 引用,
导致 s 指向了堆中所创建的这个”aaa“对象。
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马