String字符串为什么不可变的深入理解

2019-12-01 来源: 菩提树下的韦小宝 发布在  https://www.cnblogs.com/cxyxiaobao/p/11965733.html

String是被final修饰的,是不可变对象,那么这句什么意思呢。在学习scala时候var,val时候,就想到这个问题,所以记录下

看案例:

package com.cxy;

import sun.applet.Main;

import java.lang.reflect.Field;

public class StringDemo {
    public static void main(String[] args) throws Exception{
        String a ="aaa";
        System.out.println("第一次打印");
        System.out.println(a);

        a ="bbbbbb";
        System.out.println("第二次打印");
        System.out.println(a);
        Field value = null ;
        try {
            value = a.getClass().getDeclaredField("value");
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        value.setAccessible(true);
        char[] o = (char[])value.get(a);
        o[]=';
        System.out.println("第三次打印");
        System.out.println(a);

    }
}

看执行结果:

同样三次打印为什么打印的还是不同值呢,String是被final修饰的,不可变,到底有没有错呢,显然是没有错的

那么这句话是什么意思呢,

  意思这样的,String修饰的变量,是a,那么执行的地址是那个,等号左边为引用,那么右边地址,

  所以String s =”aaaaa“时,指向的是字符串中aaaaa的地址值,那么字符串创建出来之后,是无法修改的,所以说String变量是无法修改的,是无法修改”aaaaa“这个值

  其实也不是无法修改的,只是 没有给我们提供修改字符串的方法,看如下图

所以,可以通过反射来操作。修改之后,会重新创建一个字符常量,并不是把原来的删除

相关文章