为了账号安全,请及时绑定邮箱和手机立即绑定

String真的是不可变的吗?

标签:
Java

你可能问一个人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));
    }

5b9877dc0001efb510270221.jpg

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

原文出处:https://www.cnblogs.com/keeya/p/9525516.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消