黑马程序员技术交流社区

标题: String字符串的问题 [打印本页]

作者: mafu1993    时间: 2016-10-11 00:47
标题: String字符串的问题
public static main(String[] args){
         String s1 = new String();
         s1 = "hello';
         String s2 = new String();
         s2 = "hello';
         System.out.println(s1==s2);//结果为true

         String s1 = new String("hello");
         
         String s2 = new String("hello");
         System.out.println(s1==s2);//结果为false
}

谁能帮我解释下上面的代码问题啊,==这个逻辑判断符是比较地址值的啊,上面这个结果有点不明白
作者: shengbo7    时间: 2016-10-11 07:31
下面的new了两个对象,两个对象的地址值是不同的,所以false,上面的是s1和s2都赋值成相同的值,所以true

作者: songchangchang    时间: 2016-10-11 09:28
字符串被赋值相当于常量,s1被赋值后指向了方法区常量池中hello的地址,s2虽然创建了对象,但你再给他赋值hello的话还是先从常量池中找,找到了就直接把常量池中hello的地址值给s2了,所以他们地址值变相同了.
下面是地址值不同
作者: 哦啊啊    时间: 2016-10-11 11:04
常量池没有就创有就不创

作者: zhichi123    时间: 2016-10-11 13:20
没有new就直接调取常量池 常量池里面存的地址一样的
作者: 叫我宁采臣    时间: 2016-10-11 20:37
第二个是在堆内存 的 第一个是在方法区
作者: Jarc    时间: 2016-10-11 22:50
只要不用new,就从常量池直接拿,并且不会创建多次
作者: zhaokun1114    时间: 2016-10-11 23:00
6666666666666666666666
作者: 飞舞的指尖    时间: 2016-10-11 23:26
== 比较的是地址值,  new 对象时每次都会产生不同的地址值,所以,将new的对象的地址值赋值给s时,两个s 的地址值是不同的
作者: 马文丽    时间: 2016-10-11 23:37
解释的人这么多,那我就鼓励鼓励你,顺便挣黑马币{:2_32:}加油




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