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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangning9130 中级黑马   /  2013-7-14 18:22  /  1728 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

有一个问题关于String 的问题困扰了我很久,大家都知道 String  s1=“abc”;   还有一种是  String s2 = new String(“abc”);
我现在只知道   s1 并不等同于s2。但是为什么?            system.out.println(s1==s2)为什么会输出 false 呢???

7 个回复

倒序浏览
==是判断等号两边的对象在内存中的地址是否一样,s1和s2明显在内存中的地址不一致,不过使用equals方法来判断的话,是判断两个String对象的内容是否相等,这个时候返回的就是true.
回复 使用道具 举报
==比较的是内存的地址 equals比较的内容。
String  s1=“abc”其中s1指向的是一个内存地址
String s2 = new String(“abc”);s2指向的是一个内存的地址
地址是不一样的!所以是false  
要是用equals比较内容,那么即使true!
希望对你有帮助!
回复 使用道具 举报
你创建了两个实例,所以引用类型指向不同的地址。==比较的是两个地址的值,不是内容。内容需要方法equals
回复 使用道具 举报
你创建了两个实例,所以引用类型指向不同的地址。==比较的是两个地址的值,不是内容。内容需要方法equals
回复 使用道具 举报
本帖最后由 一木榜公 于 2013-7-14 23:41 编辑

大家都知道 String  s1=“abc”;   还有一种是  String s2 = new String(“abc”);我现在只知道   s1 并不等同于s2。但是为什么?

              s1,s2接收的是 对象的引用(也就是地址),"abc"字符串 存在常量池中,new String("abc")字符串在堆内存中,这是两个不同的对象,
地址不一样,

所以,s1!=s2

这两个语句还有一个区别是:
s1语句中只有一个对象,s2语句中有两个对象("abc"   与 s2指向的对象)



            system.out.println(s1==s2)为什么会输出 false 呢???

                           s1,s2指向的对象地址不一样,所以false



回复 使用道具 举报
两种String的方法都是可行的,而你说的s1不等于s2,是指引用指向不同,也就是地址值的不同!我们main函数运行的时候先会在栈内存中,然后s1,s2会在堆内存中开辟两个空间存放相对应的值!!你s1==s2,比较的不是值,是栈内存中指向堆内存的那个地址值的比较,他们两个都有各自的空间,当然就不可能相同啦!因为不是同一个空间嘛!!如果是比较值的话你可以使用equals方法~那么就会相等了
回复 使用道具 举报
==是判断等号两边的对象在内存中的地址是否一样,
String  s1=“abc”;   //分配了一个地址给s1
String s2 = new String(“abc”);//又分配了一个新地址给s2
s1和s2明显在内存中的地址不一致,
equals是判断两个String对象的内容是否相等,
  1. public class test{
  2.         public static void main(String[] args){
  3.                 String s1 = "abc";
  4.                 String s2 = new String("abc");
  5.                 System.out.println(s1.equals(s2));//true
  6.                 System.out.println(s1==s2);//false
  7.         }
  8. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马