对String的浅向理解

import java.lang.reflect.Field;

public class test {

    public static void main(String[] args) throws Throwable, SecurityException {
        // TODO Auto-generated method stub
        String ss = "Hello World!!!";
        System.out.println(ss);
        /**
         * String是不可以更改的这也是为什么这些方法都有返回值的原因其实是新new了
         * 地址让这个ss指向这个新的地址而已,之前存在的Hello World还是存在的
         * */
        ss.replace("H", "h");//下述源码
        System.out.println(ss);
        /**
         * String是不可以更改的这也是为什么这些方法都有返回值的原因其实是新new了
         * 地址让这个ss指向这个新的地址而已,之前存在的Hello World还是存在的
         * 怎么样才能改变呢,可以利用反射机制进行修改属性值的访问权限
         * */
        //源码中String这个类里面有这个private final 的value变量声明,我们的内容其实就是放在了这个数组里面
        Field valueFieldOfString = String.class.getDeclaredField("value");
          //改变value属性的访问权限  
        valueFieldOfString.setAccessible(true);  

        //获取s对象上的value属性的值  
        char[] value = (char[]) valueFieldOfString.get(ss); 
        value[5] = '_';
        System.out.println("利用反射机机制进行修改后的值"+ss);

    }

}

关于replace这个函数源码

 public String replace(char oldChar, char newChar) {
        if (oldChar != newChar) {
            int len = value.length;
            int i = -1;
            char[] val = value; /* avoid getfield opcode */

            while (++i < len) {
                if (val[i] == oldChar) {
                    break;
                }
            }
            if (i < len) {
                char buf[] = new char[len];
                for (int j = 0; j < i; j++) {
                    buf[j] = val[j];
                }
                while (i < len) {
                    char c = val[i];
                    buf[i] = (c == oldChar) ? newChar : c;
                    i++;
                }
                //由此可见开辟了一个新的地址 通过返回值让ss改变
                //指向 ,指向此处new的String。
                return new String(buf, true);//下述源码
            }
        }
        return this;
    }
String(char[] value, boolean share) {
        // assert share : "unshared not supported";
        //这个地方的this.value就是一开始说的String这
        //个类里的private final char型的一个数组
        this.value = value;
    }

参考—>
http://blog.youkuaiyun.com/zhangjg_blog/article/details/18319521

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值