String(char[] value, boolean share) {
记录一下今天被蠢到
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) {的更多相关文章
- C++中int,float,string,char*的转换(待续)
//float转string char a[100]; float b = 1.234; sprintf(a, "%f", b); string result(a); //int转 ...
- C#入门篇6-6:字符串操作 StringBiulder string char[]之间的转化
//StringBiulder string char[]之间的转化 public static void Fun3() { StringBuilder sb = new StringBuilder( ...
- CString string char* char 之间的字符转换(多种方法)
在写程序的时候,我们经常遇到各种各样的类型转换,比如 char* CString string 之间的互相转换.首先解释下三者的含义. CString 是一种很有用的数据类型.它们很大程度上简化了MF ...
- C++ wstring string char* wchar_t相互转换
标签: stringwstringwchar_tcharc++2013-12-19 00:29 3721人阅读 评论(0) 收藏 举报本文章已收录于: C++知识库 分类: C/C++(50) 1. ...
- string,char*,int 之间的转化
c++中经常遇到string,char*,int之间的相互转化,今天就来整理一下. 以下是转载并修改的内容: 以下是常用的几种类型互相之间的转换 string 转 int先转换为char*,再使用at ...
- 【转】CString,string,char*综合比较
(一) 概述 1.string和CString均是字符串模a板类: 2.string为标准模板类(STL)定义的字符串类,已经纳入C++标准之中: 3.CString(typedef CString ...
- mfc CString,string,char* 之间的转换
知识点: CString转char*,string string转char*,CString char* 转CString,string 一.CString转char*,string //字串转换测试 ...
- (c++) int 转 string,char*,const char*和string的相互转换
一.int 和string的相互转换 1 int 转化为 string c++ //char *itoa( int value, char *string,int radix); // 原型说明: / ...
- (C/C++) string / *char / int 基本轉換
網路上有許 string / *char / integer 基本轉換方式 string 與 *char 互相轉換的方法 /* string to *char */ string ssbuf1 = & ...
随机推荐
- wpf 富文本编辑器richtextbox的简单用法
最近弄得一个小软件,需要用到富文本编辑器,richtextbox,一开始以为是和文本框一样的用法,但是实践起来碰壁之后才知道并不简单. richtextbox 类似于Word,是一个可编辑的控件.结构 ...
- 解析和遍历一个HTML文档
如何解析一个HTML文档: String html = "<html><head><title>First parse</title>< ...
- Oracle数据库 —— DDL
时间:2016-10-5 14:55 逆风的方向更适合飞翔我不怕千万人阻挡只怕自己投降 --------------------------------------- 一.表的创建与管理1.表的基本操 ...
- reids在linux上的安装《四》
linux 安装redis 完整步骤 红色字体在我的Centos上没有设置,因为我设置了密码 安装: 1.获取redis资源 wget http://download.redis.io/release ...
- vue3.0入门(三)
前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 class绑定 对象绑定 :class='{active:isActive}' // 相当于class="active&q ...
- 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 & ...
- Google Chrome浏览器必备的20个插件
Google Chrome浏览器虽然与火狐浏览器有所区别,不过他们都是很开放的浏览器产品,所以也有许多有用的插件,这些插件对于日常生活与网络冲浪都很有用,比如网银,炒股等. Google Chrome ...
- iptables开启后造成本地套接字阻塞的问题
前段时间,我使用iptables实现了针对IP地址与MAC地址的白名单功能,即将INPUT链的默认规则设为DROP: iptables -P INPUT DROP 这样就能拒绝一切外来报文.随后只需要 ...
- golang redis
安装 下载第三方包: go get -u github.com/go-redis/redis/v9 连接 // 定义一个rdis客户端 var redisdb *redis.Client // 初始化 ...
- shell传参和变量赋值
1.变量赋值方式 (1)方式1--直接赋值(=) (2)方式2--read交互式赋值 (3)方式3--脚本传参赋值 2.read read -p "请输入你的名字和年龄:" nam ...