黑马程序员技术交流社区

标题: Java String 字符串相关的一些题 [打印本页]

作者: 黄嵘才    时间: 2013-1-15 16:46
标题: Java String 字符串相关的一些题
本帖最后由 张向辉 于 2013-1-16 11:04 编辑

Java代码


/*结果
false
false
false
*/
我原先认为结果是:
true
true
false
因为都指向内存的abc.
请解惑。
作者: 胡勇敏    时间: 2013-1-15 16:58
这个是String的特性不管你是写String s = "abc' 还是String s1 = new String"abc"他们都是new操作。剩下的你自己想。
作者: 陈丽莉    时间: 2013-1-15 17:17
本帖最后由 陈丽莉 于 2013-1-15 17:18 编辑

      因为String s=new String(“abc”)是在内存中创建对象abc,再创建一个String对象s指向abc。(不存在查找是否有abc这个字符串的过程),所以和new相比的字符串都是false的。
    而String s1=“abc”;是创建一个字符串对象s1后,先在string池里面查找是否有abc,若有,指向它,若没有,则在string池中新建abc并让s1指向它,所以这里的s和s2都为内存中的abc,地址都不相同。
    如果在楼主代码的基础上添加String s3=“abc”;和System.out.println(s3==s1);则s3会先在string池中寻找是否有abc,发现后将其地址(也就是s1指向的地址)存入s3,所以结果为true。
作者: 胡勇敏    时间: 2013-1-15 17:29
陈丽莉 发表于 2013-1-15 17:17
因为String s=new String(“abc”)是在内存中创建对象abc,再创建一个String对象s指向abc。(不存 ...

这个解释比较到位。
作者: 夏晓彤    时间: 2013-1-15 17:54
本帖最后由 夏晓彤 于 2013-1-15 18:08 编辑

第一句执行后内存中有两个对象,而不是一个。一个由new String("abc")中的"abc"在String Pool里生成一个值为"abc"的对象;第二个由new在堆里产生一个值为"abc"的对象,该对象完全是String Pool里的"abc"的一个拷贝。变量s最后指向堆中产生的"abc"对象;
第二句执行时,s1先去String Pool找是否有值为"abc"的对象,很显然在上一步中java已经在String Pool里生成一个"abc"对象了,所以s1直接指向String Pool中的这个"abc";
第三句中又有一个new,在java中凡遇到new时,都会在堆里产生一个新的对象。因此,该句执行后堆里又多了一个"abc"对象,这与执行第一句后生成的"abc"是不同的两个对象,s2最后指向这个新生成的对象。
因此,执行后面的打印语句的结果是三个false
作者: yong230    时间: 2013-1-15 19:32
引用类型只要用new 实例化 就会重新分配内存空间,产生新的对象,用==比较引用类型表示他们的内存地址必须相等,由于分配了新的内存空间,所以内存地址不同故用为false




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