我是靠谱客的博主 迷人电话,最近开发中收集的这篇文章主要介绍String类的【不可改变】真相,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在我们刚入门Java的时候,就被告知String类不可改变,但是究竟它哪里不能变,是内容不能变?还是什么不能变?又是怎么个不能变?对此我们一无所知。接下来我打算扒一扒源码分析这个问题。

源码

  1. 众所周知String底层是char数组,先找到存储它的数组,发现这个数组被final修饰
  2. final 修饰特点:一旦初始化其内容不可改变。
  3. 数组final 修饰特点:数组长度不可改变。
  4. Ctrl+O查看String的方法列表,并没有发现能够更改value数组值的方法
/** The value is used for character storage. */
 private final char value[];

结论

综上所述,得出String的不可变真相:

对于String类来说,不可变有两个含义:

1) 字符串长度不可变,这是由于底层是char[]数组决定的
2) 字符串内容不可变,这是由于String类没有提供修改内容的方法导致的。

对于第二种”不可变”的含义,是有办法让其内容发生改变的——使用反射:
String s = " a b ";
System.out.println(s);
// 通过反射从方法区内存空间获取String类相关信息
Class clazz= String.class;
// 获取value数组这个属性
Field f = clazz.getDeclaredField("value");
// 绕过正常访问机制,增加访问权限
f.setAccessible(true);
// 获取value属性值
char[] cs = (char[])f.get(s);
// 给value数组重新赋值
cs[0] = 'a';
System.out.println(s);

输出
a b
aa b

总结

因此,String类的不可变,指的是其中char[]数组的长度不可变,然而内容,其实是可以通过反射改变的。

最后

以上就是迷人电话为你收集整理的String类的【不可改变】真相的全部内容,希望文章能够帮你解决String类的【不可改变】真相所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(59)

评论列表共有 0 条评论

立即
投稿
返回
顶部