1. 如何改变String类的值,保证地址不变?
我们都知道String是一个不可变类,因为它的源码内部维护着一个final修饰的char数组,final修饰的变量不可以被改变,修饰的方法不可以被重写,修饰的类不可以被继承:(简要源码)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */ private final char value[];}
也就是说:String对象一旦创建,就不可改变。拼接、截取或者重新赋值都是在重新建对象。做一下代码演示:
/** * @Author 程Sir * @Version 2020年3月 * @description 描述:字符串不可以被改变 */public class Demo {
public static void main(String[] args) throws IOException {
String str = "不变的字符串"; System.out.println( str +" : " + str.hashCode()); str = str.substring(2); System.out.println(str +" : " + str.hashCode()); str = str+1; System.out.println( str +" : " + str.hashCode()); }}
输出的结果是:
1. 不变的字符串 : 833613543. 的字符串 : 9273273272. 的字符串1 : -1317623886
通过演示表明:hashcode值每次都是不一样的。说明操作的不是同一对象,再次过程中有新的对象被创建。
我们学习了反射机制,了解到:反射是在运行期能够对类的属性、方法进行操作。即:运行期绑定。那么我们是不是可以在String运行期对它的值进行一个完美操作了,答案是肯定的,完全可以的,看以下代码:
/** * @Author 程Sir * @Version 2020年3月 * @description 描述:字符串不可以被改变 */public class Demo {
public static void main(String[] args) throws IOException {
String str = "不变的字符串"; System.out.println( str +" : " + str.hashCode()); try {
//反射通过属性拿到值,Sting类的属性char数组的属性名为:value Field field = str.get