黑马程序员技术交流社区

标题: 关于String类的问题 [打印本页]

作者: 斥候7300    时间: 2015-12-20 22:05
标题: 关于String类的问题
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
        }
}
作者: 斥候7300    时间: 2015-12-20 22:06
s1和s4 不同,为什么答案是 false
作者: 意念痴心灬戒贪    时间: 2015-12-21 00:09
==返回的是地址的值
作者: Hi.。    时间: 2015-12-21 02:15
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。
作者: songjianzaina    时间: 2015-12-21 10:01
楼主可以参阅该贴:
http://bbs.itheima.com/forum.php ... p;page=1#pid2129011
作者: 斥候7300    时间: 2015-12-23 11:23
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
斥候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);
这样明白了吗?

作者: 雨非飞飞    时间: 2015-12-23 13:36
比较的东西不同
作者: chengz    时间: 2015-12-23 20:12
学习学习





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