介绍
这期内容当中小编将会给大家带来有关深入浅析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对于字符串类只是维护了一个最后的类型的字符数组啊。怪不得赋值之后就不能改变了呢。
但是也许你会有疑问,咦,不对啊,”我经常使用字符串的什么取代方法改变字符串的内容啊。你这则么解释呢?”
其实答案还是那样,它真的没变,我们并没有看到事情的真相,相信看完下面的源码,你就明白了。
/* * *返回一个字符串替换出现的所有的结果 在这个字符串* {@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项目中字符串的可变性