A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© mafu1993 中级黑马   /  2016-10-11 00:47  /  1162 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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
}

谁能帮我解释下上面的代码问题啊,==这个逻辑判断符是比较地址值的啊,上面这个结果有点不明白

9 个回复

倒序浏览
下面的new了两个对象,两个对象的地址值是不同的,所以false,上面的是s1和s2都赋值成相同的值,所以true
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
字符串被赋值相当于常量,s1被赋值后指向了方法区常量池中hello的地址,s2虽然创建了对象,但你再给他赋值hello的话还是先从常量池中找,找到了就直接把常量池中hello的地址值给s2了,所以他们地址值变相同了.
下面是地址值不同
回复 使用道具 举报
常量池没有就创有就不创
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
没有new就直接调取常量池 常量池里面存的地址一样的
回复 使用道具 举报
第二个是在堆内存 的 第一个是在方法区
回复 使用道具 举报
Jarc 高级黑马 2016-10-11 22:50:35
7#
只要不用new,就从常量池直接拿,并且不会创建多次
回复 使用道具 举报
6666666666666666666666
回复 使用道具 举报
== 比较的是地址值,  new 对象时每次都会产生不同的地址值,所以,将new的对象的地址值赋值给s时,两个s 的地址值是不同的
回复 使用道具 举报
解释的人这么多,那我就鼓励鼓励你,顺便挣黑马币{:2_32:}加油
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马