黑马程序员技术交流社区

标题: Java中StringBuilder转化为字符串之后,相等比较的问题 [打印本页]

作者: 雷丹    时间: 2013-10-24 10:58
标题: Java中StringBuilder转化为字符串之后,相等比较的问题
public static void main(String[] args) {
                StringBuilder orgin = new StringBuilder("12321");
                String sOrgin = orgin.toString();
                StringBuilder orgin2 = orgin.reverse();
                String sOrgin2 = orgin2.toString();               
                System.out.println(sOrgin==sOrgin2);
                System.out.println(sOrgin.equals(sOrgin2));
        }

运行结果,第一个是false,第二个是true。

现在想问的是,第一个结果为何是false,在执行String sOrgin = orgin.toString();之后,sOrgin是栈上的引用,orgin.toString()还是堆上的空间吗。从结果上看貌似是的,堆上的字段进行运算之后还是分配在堆上是吗 自己不太明白。
作者: 孙涛00    时间: 2013-10-24 11:15
System.out.println(sOrgin==sOrgin2);中这是两个对象,在栈的引用,各自指向堆里面的两个String实例,当然是不相等,因为他们本来就是不同的两个对象。
sOrgin.equals(sOrgin2)是判断两个String对象的值是否相等,只要相等就返回true。
作者: 王飚    时间: 2013-10-24 12:16
这个问题的关键是sOrgin和sOrgin2本来就是两个不同的对象,所以用“==”当然就不相等了,而equals则是被String类重写,所以,具有自己特有的比较方式,所以结果为true;
作者: 向阳泪无痕    时间: 2013-10-24 12:17
  1.         public static void main(String[] args) {
  2.         StringBuilder orgin = new StringBuilder("12321");
  3.         
  4.         String sOrgin = orgin.toString();//返回新的字符串
  5.         
  6.         StringBuilder orgin2 = orgin.reverse();//反转
  7.         
  8.         String sOrgin2 = orgin2.toString();  //返回新的字符串
  9.         
  10.         System.out.println(sOrgin==sOrgin2);//“==”比较其引用,两次返回的地址是不一样的,所以是不同的,flase
  11.         
  12.         System.out.println(sOrgin.equals(sOrgin2));//“equals”比较的是两个字符串的内容是否相同,因为反转后值是一样的,所以是true
  13.         }
复制代码

作者: 漫步人    时间: 2013-10-24 13:48
System.out.println(sOrgin==sOrgin2);中这是两个对象,在栈的引用,各自指向堆里面的两个String实例,当然是不相等,因为他们本来就是不同的两个对象。 sOrgin.equals(sOrgin2)是判断两个String对象的值是否相等,只要相等就返回true。
作者: qixing0918    时间: 2013-10-25 09:04
System.out.println(sOrgin==sOrgin2);//“==”比较其引用,两次返回的地址是不一样的,所以是不同的,flase
System.out.println(sOrgin.equals(sOrgin2));//“equals”比较的是两个字符串的内容是否相同,因为反转后值是一样的,所以是true
说到对
string 类重写了 object的 equals 方法 object的equals 就是==地址值比较 而string 是比较对象具体值
我要说的是 一个字符串的 创建要有两个对象 一个是在池内 一个是在池外 当然你创建的对象引用池外的
而当你再去 创建一个对象时 jvm会去池内找 如果有直接引用  如果没有就要重复上一步




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