东莞市盛裕绒艺玩具有限公司

东莞市盛裕绒艺玩具有限公司

大发bet最新客服

15368731600
联系方式
全国服务热线: 15368731600

咨询热线:15293929267
联系人:马星亮
地址:内蒙古自治省包头市东河区铁西区

String真的是不可变的吗?

来源:大发bet最新客服   发布时间:2019-06-23   点击量:447

你可能问一个人String是可变的吗?想必他们都会一口同生的说String是不可变的,因为String是final修饰的,而且它底层的是final修饰的char[]数组。

可以看到String源码:

public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];

所以说String是不可变得,但是我们忽略了反射,利用反射我们可以改变String的值,话不多说看反射是如何做到的:

public static void main(String[] args) throws Exception { // 创建字符串"Hello World", 并赋给引用s String s = "Hello World"; //把这个s保存一份用于对比 String temp = s; System.out.println("s和temp是否相等? " + s.equals(temp)); System.out.println("s = " + s); // Hello World // 获取String类中的value字段 Field valueFieldOfString = String.class.getDeclaredField("value"); // 改变value属性的访问权限 valueFieldOfString.setAccessible(true); // 获取s对象上的value属性的值 char[] value = (char[]) valueFieldOfString.get(s); // 改变value所引用的数组中的第5个字符 value[5] = "_"; System.out.println("s = " + s); // Hello_World System.out.println("s和temp是否相等? " + s.equals(temp)); }

可以发现我们利用反射绕过了私有权限修改了String底层的 char[]数组,我想看过这篇文章的小伙伴你们知道当别人问起String是不是可变的时候该怎么说了吧?

, 1, 0, 9);

相关产品

COPYRIGHTS©2017 大发bet最新客服 ALL RIGHTS RESERVED 备案号:447