首页 > 其他 > 详细

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

时间:2019-12-01 14:40:43      阅读:67      评论:0      收藏:0      [点我收藏+]

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[2]=3;
        System.out.println("第三次打印");
        System.out.println(a);


    }
}

看执行结果:

技术分享图片

 

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

 

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

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

 

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

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

技术分享图片

 

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

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

原文:https://www.cnblogs.com/cxyxiaobao/p/11965733.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!