黑马程序员技术交流社区

标题: 关于String字符串的比较 [打印本页]

作者: 罗杰    时间: 2012-3-27 08:57
标题: 关于String字符串的比较
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
结果显示true

String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2);
结果显示false

为什么不一样呢?听老师讲过,又忘了。。。
作者: 王国华    时间: 2012-3-27 09:01
本帖最后由 王国华 于 2012-3-27 09:14 编辑

String s1 = new String("abc");
String s2 = new String("abc");
new每次都建一个新对象,所以指向不同的对象
String s1 = "abc";
String s2 = "abc";//此时会去内存中查找是否存在"abc"若存在则指向
此时s1和s2都指向同一个对象

作者: 应佳锋    时间: 2012-3-27 09:03
这种题目如果我直接告诉你答案 只是治标不治本 是不负责的
建议先去了解什么叫值类型 什么叫引用类型  等理解了这2个东西你就知道 所以然了!
作者: 孙地豪    时间: 2012-3-27 09:24
String s1 = "abc";       // s1  指向 静态区中的 "abc"地处
String s2 = "abc";     //  s2 也指向  静态区中的 "abc"地处  因为 在静态区中 已经有 "abc"地处,就不会在开辟 "abc"地处。
                   // 所以 s2  和 s1指向了 同一个"abc"    String s2 = "abc" 相当于 String s2  = s1

System.out.println(s1 == s2);   
结果显示true

String s1 = new String("abc");    //new String("abc")  是在 内存 堆 中开辟的 一块新空间
String s2 = new String("abc");     //new String("abc")  是在 内存 堆 中开辟的 一块新空间
System.out.println(s1 == s2);    //他们 指向的 不是同一地址 , 结果当然返回false

作者: 〆_xin_、_跳    时间: 2012-3-27 10:44
String s1 = "abc";
String s2 = "abc";
像这种形式,内容相同,只是变量名不为,系统会分配同一内存空间。
String s1 = new String("abc");
String s2 = new String("abc");
这种形式,每new一次,系统会分配一个内存空间,s1为一个内存地址,s2为另外一个内存地址,所以两个不是同一内存空间
作者: 1002865186    时间: 2012-3-27 11:00
==比较的的是内存地址,String 在new 的时候 即使内容一样 创建的也是不同的对象
作者: 李井山    时间: 2012-3-27 11:04
String s1 = "abc";
String s2 = "abc";
在内存中是同一个,而如果你用new的话,是一定创建一个新对象的
作者: 李见黎    时间: 2012-3-27 11:06
new每次都建一个新对象,所以指向不同的内存区域。==比较的是内存地址。




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