黑马程序员技术交流社区

标题: 关于String变量的声明方式。 [打印本页]

作者: wangning9130    时间: 2013-7-14 18:22
标题: 关于String变量的声明方式。
有一个问题关于String 的问题困扰了我很久,大家都知道 String  s1=“abc”;   还有一种是  String s2 = new String(“abc”);
我现在只知道   s1 并不等同于s2。但是为什么?            system.out.println(s1==s2)为什么会输出 false 呢???

作者: wedge    时间: 2013-7-14 18:31
==是判断等号两边的对象在内存中的地址是否一样,s1和s2明显在内存中的地址不一致,不过使用equals方法来判断的话,是判断两个String对象的内容是否相等,这个时候返回的就是true.
作者: 杨增坤    时间: 2013-7-14 19:18
==比较的是内存的地址 equals比较的内容。
String  s1=“abc”其中s1指向的是一个内存地址
String s2 = new String(“abc”);s2指向的是一个内存的地址
地址是不一样的!所以是false  
要是用equals比较内容,那么即使true!
希望对你有帮助!
作者: 诸隆隆    时间: 2013-7-14 22:32
你创建了两个实例,所以引用类型指向不同的地址。==比较的是两个地址的值,不是内容。内容需要方法equals
作者: 诸隆隆    时间: 2013-7-14 22:32
你创建了两个实例,所以引用类型指向不同的地址。==比较的是两个地址的值,不是内容。内容需要方法equals
作者: 一木榜公    时间: 2013-7-14 23:39
本帖最后由 一木榜公 于 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




作者: 白_蓝(八公)    时间: 2013-7-15 01:15
两种String的方法都是可行的,而你说的s1不等于s2,是指引用指向不同,也就是地址值的不同!我们main函数运行的时候先会在栈内存中,然后s1,s2会在堆内存中开辟两个空间存放相对应的值!!你s1==s2,比较的不是值,是栈内存中指向堆内存的那个地址值的比较,他们两个都有各自的空间,当然就不可能相同啦!因为不是同一个空间嘛!!如果是比较值的话你可以使用equals方法~那么就会相等了
作者: sunalong    时间: 2013-7-15 17:53
==是判断等号两边的对象在内存中的地址是否一样,
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. }
复制代码





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