深入浅析java项目中字符串的可变性

  介绍

这期内容当中小编将会给大家带来有关深入浅析java项目中字符串的可变性,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

<强>起因

深入浅析java项目中字符串的可变性

正如我们所理解的,通过

/* *
  *字符串中对于内容和地址的判定可以用下面两种方式,但侧重点不一样。
  */=//判断两个字符串的内容是否一致==//判断两个字符串的内存地址是否一致

且看下面的代码:

公共静态空简单(){
  字符串s1=癏ello World !”;
  字符串s2=癏ello World !”;
  字符串s3=新的字符串(“Hello World !”);
  字符串s4=新的字符串(“Hello World !”);//下面开始比较引用和内容的比较
  System.out.println(“字符串赋值方式:“);
  System.out.println (s1==s2);
  System.out.println (s1.equals (s2));
  
  System.out.println (“\ n字符串赋值方式和新的方式:“);
  System.out.println (==s1);
  System.out.println (s1.equals (s3));
  
  System.out.println (“\ nnew方式:“);
  System.out.println (s3==s4);
  System.out.println (s3.equals (s4));
  }

得到的结果如下:

字符串赋值方式:   真正的   真正的      字符串赋值方式和新的方式:   假   真正的      新的方式:   假   真正的

结果却是和我们所说的那样。

<强>深入源码

不出所料,字符串确实是“不可变的”,每次改变底层其实都是创建了一个心的字符串对象,然后赋予了新值。

为什么会这样呢?我们也许可以在源码中找到真相。

深入浅析java项目中字符串的可变性

哦,原来java对于字符串类只是维护了一个最后的类型的字符数组啊。怪不得赋值之后就不能改变了呢。

但是也许你会有疑问,咦,不对啊,”我经常使用字符串的什么取代方法改变字符串的内容啊。你这则么解释呢?”

其实答案还是那样,它真的没变,我们并没有看到事情的真相,相信看完下面的源码,你就明白了。

/* *   *返回一个字符串替换出现的所有的结果   在这个字符串* {@code oldChar} {@code newChar}。   * & lt; p>   *如果字符{@code oldChar}不会在发生   *字符序列由这个}{@code字符串对象,   *然后引用}{@code字符串对象返回。   *否则,{}@code字符串对象返回   *代表一个字符序列相同的字符序列   *代表这个}{@code字符串对象,除了每个   *发生{@code oldChar}被发生   *的{@code newChar}。   * & lt; p>   *的例子:   * & lt; blockquote> & lt; pre>   *“豆科灌木在你cellar" .replace (& # 39; e # 39; & # 39; o # 39;)   *返回“蚊子在你collar"   *“baronets"战争;.replace (& # 39; " # 39; & # 39; y # 39;)   *返回“bayonets"的方式;   *“与紫色porpoise" .replace (& # 39; p # 39; & # 39; t # 39;)   *返回“与一只乌龟tortoise"主演;   *“JonL" .replace(& # 39;提问# 39;,& # 39;x # 39;)返回“JonL"(没有变化)   * & lt;/pre> & lt;/blockquote>   *   * @param oldChar旧的角色。   * @param newChar新角色。   * @return源自这个字符串代替每一个字符串   *发生{@code oldChar}与{@code newChar}。   */公共字符串替换(char oldChar char newChar) {   如果(oldChar !=newChar) {   int len=value.length;   int i=1;   char [] val=价值;/*避免getfield操作码*/而(+ + i & lt;len) {   如果(val[我]==oldChar) {   打破;   }   }   如果我& lt;len) {   字符缓冲区新char []=[len];   for (int j=0;j & lt;我;j + +) {   但[j]=val [j];   }   虽然(我& lt;len) {   字符c=val[我];   但[我]=(c==oldChar), # 63;newChar: c;   我+ +;   }   返回新字符串(buf,真实);   }   }   返回;   }

深入浅析java项目中字符串的可变性