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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 斥候7300 中级黑马   /  2015-12-20 22:05  /  847 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Demo {
        public static void main(String[] args) {
                String s1="aaaa";
                String s2 ="aaaa";
               
                String s3 ="bbbb";
                String s4=s3.replace('b', 'a');
                System.out.println(s4);  //aaaa
               
                System.out.println(s1==s2);  //   ture
                System.out.println(s1==s4);   //  false
        }
}

8 个回复

倒序浏览
s1和s4 不同,为什么答案是 false
回复 使用道具 举报
==返回的是地址的值
回复 使用道具 举报
String s1 = "aaaa";
String s3 = "bbbb";
String s4 = s3.replace('b', 'a');
s1是直接从字符串常量池中,直接创建字符串对象,赋值给了s1
s4,,等价于 String s4 = new String(chs);  //这里的chs,是替换后结果的char[],即{'b' ,'b' ,'b' ,'b'}
相当于,先在堆内存开辟一个空间,再把字符串常量池中的"aaaa"赋值给堆内存。
==比较的是地址值,两个对象的指向不同,所以false。
回复 使用道具 举报
回复 使用道具 举报
Hi.。 发表于 2015-12-21 02:15
String s1 = "aaaa";
String s3 = "bbbb";
String s4 = s3.replace('b', 'a');

你的意思是 s4 指向的是 堆内存中的地址?     但有人s4说是指向 字符串缓冲区 中的地址,我都快蒙了
回复 使用道具 举报
Hi.。 中级黑马 2015-12-23 11:53:53
7#
斥候7300 发表于 2015-12-23 11:23
你的意思是 s4 指向的是 堆内存中的地址?     但有人s4说是指向 字符串缓冲区 中的地址,我都快蒙了 ...

因为s4是由s3调用replace()方法得到的,看replace的源码:
  1. public String replace(char oldChar, char newChar) {
  2.         if (oldChar != newChar) {
  3.             int len = value.length;
  4.             int i = -1;
  5.             char[] val = value; /* avoid getfield opcode */

  6.             while (++i < len) {
  7.                 if (val[i] == oldChar) {
  8.                     break;
  9.                 }
  10.             }
  11.             if (i < len) {
  12.                 char buf[] = new char[len];
  13.                 for (int j = 0; j < i; j++) {
  14.                     buf[j] = val[j];
  15.                 }
  16.                 while (i < len) {
  17.                     char c = val[i];
  18.                     buf[i] = (c == oldChar) ? newChar : c;
  19.                     i++;
  20.                 }
  21.                 return new String(buf, true);
  22.             }
  23.         }
  24.         return this;
  25.     }
复制代码

这样就很清楚了, return new String(buf, true);
即,等价于 String s4 = new String String(buf, true);
这样明白了吗?

评分

参与人数 1黑马币 +5 收起 理由
斥候7300 + 5 很给力!

查看全部评分

回复 使用道具 举报
比较的东西不同
回复 使用道具 举报
chengz 中级黑马 2015-12-23 20:12:51
9#
学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马