记录一下今天被蠢到

1. 在观察StringBuffer类的toString方法时,发现了个没见过的方法

return new String(toStringCache, true);

    @Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}

2. 发现它传了一个true进去,然后点进去后

发现它对传进去的true没有做任何操作,学到了一种新的“方法重载思想”,传一个boolean只是为了区分方法

    String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}

在此处我发现这个this.value = value;

此时就很懵,这个是String类里面的value,这个不是不可以修改的么,然后各种查,各种测试

private final char value[];

最后发现这个是一个new String 操作,所以对一个final修饰的value[]来说,此时他还没有被赋值,所以是可以进行第一次赋值的

3. 那么话又说回来了,这个方法和不传boolean的有什么区别呢?

    public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
    String(char[] value, boolean share) {
// assert share : "unshared not supported";
this.value = value;
}

我们可以观察到方法的修饰符不同,一个是public的,一个是默认的,也就是只有同包才能访问,StringBuffer与String都是属于java.lang包下的,所以StringBuffer可以使用,而我们是使用不了的,因为如果交给我们使用的话,可能会违反String是不可修改的原则的。

  • 例如如下代码:不能运行,只是示范

此时传入的b是引用,s的value中保存的也是b的引用,所以可以认为此时的b与String中的value是同一个对象,此时修改b[1]的值的时候,String中final修饰的value就被修改了,很明显不符合String的定义。

        char [] b = {'b','c','1'};
String s = new String(b, true);
b[1] = 'a';

而直接传入char[]数组的,是调用数组拷贝,将传入的值一一赋值到String内置的value数组中,他们两个是不同的两个对象,也就保证了String类的不可修改

4. 最后我们来强行调用一下,利用反射

    private static void test07() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {

        char[] a = {'1','f','l'};
Class<String> clazz = String.class;
Constructor<String> constructor = clazz.getDeclaredConstructor(char[].class, boolean.class);
constructor.setAccessible(true);
String s = constructor.newInstance(a, true);
System.out.println(s);
//此时修改a[1]的值
a[1]='c';
System.out.println(s);
}

我们观察打印输出,可以发现,String对象被我们修改了,也验证了我们前面的说法

1fl

1cl

String(char[] value, boolean share) {的更多相关文章

  1. C++中int,float,string,char*的转换(待续)

    //float转string char a[100]; float b = 1.234; sprintf(a, "%f", b); string result(a); //int转 ...

  2. C#入门篇6-6:字符串操作 StringBiulder string char[]之间的转化

    //StringBiulder string char[]之间的转化 public static void Fun3() { StringBuilder sb = new StringBuilder( ...

  3. CString string char* char 之间的字符转换(多种方法)

    在写程序的时候,我们经常遇到各种各样的类型转换,比如 char* CString string 之间的互相转换.首先解释下三者的含义. CString 是一种很有用的数据类型.它们很大程度上简化了MF ...

  4. C++ wstring string char* wchar_t相互转换

    标签: stringwstringwchar_tcharc++2013-12-19 00:29 3721人阅读 评论(0) 收藏 举报本文章已收录于: C++知识库 分类: C/C++(50) 1. ...

  5. string,char*,int 之间的转化

    c++中经常遇到string,char*,int之间的相互转化,今天就来整理一下. 以下是转载并修改的内容: 以下是常用的几种类型互相之间的转换 string 转 int先转换为char*,再使用at ...

  6. 【转】CString,string,char*综合比较

    (一)  概述 1.string和CString均是字符串模a板类: 2.string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中: 3.CString(typedef CString ...

  7. mfc CString,string,char* 之间的转换

    知识点: CString转char*,string string转char*,CString char* 转CString,string 一.CString转char*,string //字串转换测试 ...

  8. (c++) int 转 string,char*,const char*和string的相互转换

    一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...

  9. (C/C++) string / *char / int 基本轉換

    網路上有許 string / *char / integer 基本轉換方式 string 與 *char 互相轉換的方法 /* string to *char */ string ssbuf1 = & ...

随机推荐

  1. wpf 富文本编辑器richtextbox的简单用法

    最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单. richtextbox 类似于Word,是一个可编辑的控件.结构 ...

  2. 解析和遍历一个HTML文档

    如何解析一个HTML文档: String html = "<html><head><title>First parse</title>< ...

  3. Oracle数据库 —— DDL

    时间:2016-10-5 14:55 逆风的方向更适合飞翔我不怕千万人阻挡只怕自己投降 --------------------------------------- 一.表的创建与管理1.表的基本操 ...

  4. reids在linux上的安装《四》

    linux 安装redis 完整步骤 红色字体在我的Centos上没有设置,因为我设置了密码 安装: 1.获取redis资源 wget http://download.redis.io/release ...

  5. vue3.0入门(三)

    前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 class绑定 对象绑定 :class='{active:isActive}' // 相当于class="active&q ...

  6. Learning ROS: Ubuntu16.04下kinetic开发环境安装和初体验 Install + Configure + Navigating(look around) + Creating a Package(catkin_create_pkg) + Building a Package(catkin_make) + Understanding Nodes

    本文主要部分来源于ROS官网的Tutorials. Ubuntu install of ROS Kinetic # Setup your sources.list sudo sh -c 'echo & ...

  7. Google Chrome浏览器必备的20个插件

    Google Chrome浏览器虽然与火狐浏览器有所区别,不过他们都是很开放的浏览器产品,所以也有许多有用的插件,这些插件对于日常生活与网络冲浪都很有用,比如网银,炒股等. Google Chrome ...

  8. iptables开启后造成本地套接字阻塞的问题

    前段时间,我使用iptables实现了针对IP地址与MAC地址的白名单功能,即将INPUT链的默认规则设为DROP: iptables -P INPUT DROP 这样就能拒绝一切外来报文.随后只需要 ...

  9. golang redis

    安装 下载第三方包: go get -u github.com/go-redis/redis/v9 连接 // 定义一个rdis客户端 var redisdb *redis.Client // 初始化 ...

  10. shell传参和变量赋值

    1.变量赋值方式 (1)方式1--直接赋值(=) (2)方式2--read交互式赋值 (3)方式3--脚本传参赋值 2.read read -p "请输入你的名字和年龄:" nam ...