java中String类是不可变的,怎么让String实现可变

  作者:记性不好的阁主

  • String的源码里其实使用一个char数组来存储字符串的,String之所以说不可变,就是因为这个char数组它是private类型,而且String没有对外暴露和提供修改这个char数组的方法,因此我们无法更改这个char数组的值,所以String是不可变的



  • 注意:这里char数组被final修饰不代表不可变,因为数组是引用类型,final修饰引用类型的时候代表引用不可更改,即我们只是不能将这个value属性指向新的引用,但是它原本指向的这个char数组中的字符我们是可以更改的

    因此,如果我们可以通过更改value指向的char数组本身,就可以改变字符串。正常情况下我们是无法更改的,这也是我们说字符串不可变的原因,但是我们通过极端方法也是可以更改的,例如使用反射可以得到这个私有的value属性,然后通过爆破我们就可以访问这个私有属性了,例如:

String  s = "aabbc";
Class<? extends String> aClass = s.getClass();
Field value = aClass.getDeclaredField("value");//得到这个value属性
value.setAccessible(true);//将它设置成可以访问
char[] chars =  (char[]) value.get(s);
System.out.println(s);//在修改之前输出s
chars[0] = 'k'; //修改s
System.out.println(s);//输出修改之后的s



  • 可以看出这个字符串确实被改变了


————————————————

版权声明:本文为CSDN博主「一酒。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/w55935/article/details/124241952


相关推荐

评论 抢沙发

表情

分类选择