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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田林 中级黑马   /  2012-5-11 20:47  /  2444 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

视频中毕老师说:String s1=new String("aaa");以这种形式下,s1中有两个对象。问:s1中存放的应该是指向堆中那个对象的地址,那么谁指向常量池中的那个对象呢?还有,毕老师好像还说如果常量池中有“abc”和“cdf”,那么若新定义一个字符串“abf”,内存会从常量池中找到字符 a,b,f  用他们直接拼接成字符串"abf“。这句话怎么理解?它们在常量池中怎么存在?

5 个回复

倒序浏览
同问。。。。。。。。。。。。。。。。。。。
回复 使用道具 举报
本帖最后由 天道酬勤 于 2012-5-11 21:46 编辑

对于String
String是一个特殊的包装类数据。可以用:
String str = new String("abc");   String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆
中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对
String类的对象引用变量str,然后通过符号引用去字符串常量池 里找有没
有"abc",如果没有,则将"abc"存放进字符串常量池,并令str指向"abc",
如果已经有"abc" 则直接令str指向"abc"。

String 特性
1.        new String()和new String("")都是申明一个新的空字符串,是空串不
是null;
String s0="kvill";    String s1="kvill";  String s2="kv" + "ill";
System.out.println( s0==s1 ); //true
System.out.println( s0==s2 ); //true
例子中的 s0和s1中的"kvill"都是字符串常量,它们在编译期就被确
定了,放在常量池中,所以s0==s1为true;而"kv"和"ill"也都是字符串常
量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串
常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是
常量池中"kvill"的一个引用。此时我们应该知道,常量池中只有一个字符串
"kvill"所以我们得出s0==s1==s2;用new String() 创建的字符串不是常量,
不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它
们有自己的地址空间。

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上的分析得很好,我今天刚刚也看到了这里来了,看了几小时间啊,对于这个问题又有了更透撤的理解了,哈哈
回复 使用道具 举报
天道酬勤 发表于 2012-5-11 21:45
对于StringString是一个特殊的包装类数据。可以用:String str = new String("abc");   String str = "abc" ...

抱歉!我主要想知道的是String s1=new String("aaa"),s1中有两个对象,s1指向堆中的对象,那么谁指向常量池的“aaa”呢?还有,我后面一个问题跟你说的貌似不太一样吧?
回复 使用道具 举报
田林 发表于 2012-5-12 12:21
抱歉!我主要想知道的是String s1=new String("aaa"),s1中有两个对象,s1指向堆中的对象,那么谁指向常量 ...

new String("aaa"); aaa在常量池中,他把地址给堆内存中的对象 new String , new String把堆内存的地址复制给S1.
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马