English
联系我们
网站地图
邮箱
旧版回顾



眉山盏倨广告传媒ag贵宾厅开户|官网_String真的是不可变的吗?

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

可以看到String源码:

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

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

public final class String implements java. io. Serializable, Comparable lt String gt, CharSequence The value is used for character storage. private final char value suo yi shuo String shi bu ke bian de, dan shi wo men hu lue le fan she, li yong fan she wo men ke yi gai bian String de zhi, hua bu duo shuo kan fan she shi ru he zuo dao de:

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是不是可变的时候该怎么说了吧?

当前文章:http://www.nijyuyon.com/eg67m4be/425512-852298-34059.html

发布时间:08:25:20

www.46333.com??十二生肖开奖网站??福临门心水论坛599222??93199.com??六合心水资料库??抓码王??手机看开奖直播100922??www.lh844.Com??香港特急??杨红公式心水700488??

专题推荐

相关新闻


? 1996 - 蜘蛛资讯网 版权所有?? 联系我们

地址:北京市三里河路52号 邮编:100864