zoukankan      html  css  js  c++  java
  • String字符串为什么不可变的深入理解

    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“这个值

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

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

  • 相关阅读:
    Java 内部类种类及使用解析
    linux下的一些命令分析与shell的一些命令
    Centos7 安装gitlab
    centos7安装laravel
    laravel中对加载进行优化
    laravel如何利用数据库的形式发送通知
    laravel中的gate
    laravel中的scope作用域
    Laravel 使用firstOrCreate 报错MassAssignmentException
    laravel中关联模型并使用scout导入数据 +视图合成器
  • 原文地址:https://www.cnblogs.com/cxyxiaobao/p/11965733.html
Copyright © 2011-2022 走看看