黑马程序员技术交流社区
标题:
Java String 字符串相关的一些题
[打印本页]
作者:
黄嵘才
时间:
2013-1-15 16:46
标题:
Java String 字符串相关的一些题
本帖最后由 张向辉 于 2013-1-16 11:04 编辑
Java代码
String s = new String(“abc”);
String s1 = ”abc”;
String s2 = new String(“abc”);
System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);
/*结果
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