黑马程序员技术交流社区

标题: String类问题 [打印本页]

作者: 田林    时间: 2012-5-11 20:47
标题: String类问题
视频中毕老师说:String s1=new String("aaa");以这种形式下,s1中有两个对象。问:s1中存放的应该是指向堆中那个对象的地址,那么谁指向常量池中的那个对象呢?还有,毕老师好像还说如果常量池中有“abc”和“cdf”,那么若新定义一个字符串“abf”,内存会从常量池中找到字符 a,b,f  用他们直接拼接成字符串"abf“。这句话怎么理解?它们在常量池中怎么存在?
作者: Clown丶悠哈    时间: 2012-5-11 21:08
同问。。。。。。。。。。。。。。。。。。。
作者: 何阳    时间: 2012-5-11 21:45
本帖最后由 天道酬勤 于 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() 创建的字符串不放入常量池中,它
们有自己的地址空间。

作者: 钟成军    时间: 2012-5-11 23:47
楼上的分析得很好,我今天刚刚也看到了这里来了,看了几小时间啊,对于这个问题又有了更透撤的理解了,哈哈
作者: 田林    时间: 2012-5-12 12:21
天道酬勤 发表于 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 21:10
田林 发表于 2012-5-12 12:21
抱歉!我主要想知道的是String s1=new String("aaa"),s1中有两个对象,s1指向堆中的对象,那么谁指向常量 ...

new String("aaa"); aaa在常量池中,他把地址给堆内存中的对象 new String , new String把堆内存的地址复制给S1.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2