• java知识点:String类的值不可修改?


    核心

    首先,需要弄明白的是,这个问题是String类的值,并不是String a,String类型的字符串a的值。
    其次,需要弄清楚参数传递概念
    	- 值传递和引用传递
    	- java只有值传递,
    
    • 1
    • 2
    • 3
    • 4

    什么是引用?

    指向对象的地址

    比如有个Person 类 ,创建一个实例对象 Person p = new Person();而p就是引用,而真正的对象是new Person()

    什么是实例对象?

    也就是值

    String类的值什么不能修改?

    一般情况下,string的值修改不了。
    从源码可知,String类是使用char类型的value数组来存储字符串的,final修饰,所以String类的值(实例对象)不可修改。
    源码
    在这里插入图片描述

    String a = “abc”;改成a = “java”,为什么可以修改?

    答:该字符串修改的并非是对象本身,而是将他的另外一个对象引用赋给它,实例对象并没有改变。
    可以这么理解:
    abc存在常量区,java也存在常量区
    a =abc,a指向abc地址
    a=java,类似于return的一个操作,更改了a的指向地址到java
    上述可用hashcode的值,做辅助推断
    在这里插入图片描述

    String类的值为什么不能修改_

    方法中,为什么str值没有变化?
    String类的str,开始指向tarena,到change方法中,指向testok,随后,局部变量生命周期结束,str仍指向原值,原值没有改变,所以值不变
    ch字符串,原值发生改变,所以值变了

    在这里插入图片描述
    在这里插入图片描述

    String类型,在底层是怎么创建的?

    在这里插入图片描述

    反射机制,更改常量池里的值(也就是对象实例)

            String s="0123456789";
            System.out.println("改变前:s=" + s);
            Field f = s.getClass().getDeclaredField("value");
            f.setAccessible(true);
            f.set(s, new char[]{'a', 'b', 'c'});
            System.out.println("改变后:s=" + s);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考资料

    • String执行源码 http://t.csdn.cn/143Ra
    • 参数传递 http://t.csdn.cn/9iXog
    • http://t.csdn.cn/ZEKjE
  • 相关阅读:
    KY111 日期差值
    HZOJ-271: 滑动窗口
    [附源码]计算机毕业设计JAVA疫苗接种管理系统
    基于Python实现汽车销售数据可视化【500010086】
    《洛谷刷题笔记》day1
    Jupyter上报:ModuleNotFoundError: No module named ‘xgboost‘
    vue中解决一个部门不能选择的问题
    Spring Boot 实现参数校验基本使用
    如何不编程用 ChatGPT 爬取网站数据?
    【无标题】
  • 原文地址:https://blog.csdn.net/istend/article/details/126273336