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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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()还是堆上的空间吗。从结果上看貌似是的,堆上的字段进行运算之后还是分配在堆上是吗 自己不太明白。

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
System.out.println(sOrgin==sOrgin2);中这是两个对象,在栈的引用,各自指向堆里面的两个String实例,当然是不相等,因为他们本来就是不同的两个对象。
sOrgin.equals(sOrgin2)是判断两个String对象的值是否相等,只要相等就返回true。

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
这个问题的关键是sOrgin和sOrgin2本来就是两个不同的对象,所以用“==”当然就不相等了,而equals则是被String类重写,所以,具有自己特有的比较方式,所以结果为true;
回复 使用道具 举报
  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.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
回复 使用道具 举报
System.out.println(sOrgin==sOrgin2);//“==”比较其引用,两次返回的地址是不一样的,所以是不同的,flase
System.out.println(sOrgin.equals(sOrgin2));//“equals”比较的是两个字符串的内容是否相同,因为反转后值是一样的,所以是true
说到对
string 类重写了 object的 equals 方法 object的equals 就是==地址值比较 而string 是比较对象具体值
我要说的是 一个字符串的 创建要有两个对象 一个是在池内 一个是在池外 当然你创建的对象引用池外的
而当你再去 创建一个对象时 jvm会去池内找 如果有直接引用  如果没有就要重复上一步

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马