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 = & ...
随机推荐
- vue项目接口管理,所有接口都在apis文件夹中统一管理
参考:https://www.codercto.com/a/53432.html 在vue开发中,会涉及到很多接口的处理,当项目足够大时,就需要定义规范统一的接口,如何定义呢? 方法可能不只一种,本文 ...
- C# 线程同步的多种方式
实际应用中多个线程往往需要共享数据,因此必须使用同步技术,确保一次只有一个线程访问和改变共享数据.同步又分为进程内部线程的同步以及进程之间线程的同步. 进程内部线程同步: 1. lock : 使用比较 ...
- Centos7 安装 redis4.x
一.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz [root@iZwz991stxd ...
- 10.SpringMVC之格式化、校验
数据格式化 数据格式化的注解: 数据校验JSR303 Hibernate Validator扩展注解 启动 springMVC数据校验 转换.格式化.校验出错处理:
- Commons-Collections(二)之map
BidiMap: 双重Map 使用双向映射,可以使用值查找键,并且可以使用键轻松查找值.(自然,它可以根绝key移除,也可以根据value移除) public interface BidiMap< ...
- C++泛型编程之类模板
泛型语义 泛型(Generic Programming),即是指具有在多种数据类型上皆可操作的含意.泛型编程的代表作品 STL 是一种高效.泛型.可交互操作的软件组件. 泛型编程最初诞生于 C++中, ...
- 关于Ubuntu18.04 linux系统使用搜狗输入法 出现乱码
解决: 执行下面的命令即可!无需重启系统 killall fcitx
- hive -- 外部表、内部表、临时表
1.外部表 关键字:EXTERNAL 外部表创建时需要指定LOCATION 删除外部表时,数据不被删除 CREATE EXTERNAL TABLE page_view(viewTime INT, us ...
- vscode如何配置ts的lint,如何配置才能让eslint和prettier不冲突一键格式化代码(vue开发使用)
最近在使用ts,发觉tslint在vscode上使用很不方便,不如eslint一键格式化高效,就想着能不能配置下vscode让其像写js一样爽 这篇文章主要解决2个问题,第一个是如何让vscode使用 ...
- freeswitch新增模块
概述 freeswitch的架构由稳定的核心模块和大量的外围插件式模块组成.核心模块保持稳定,外围模块可以动态的加载/卸载,非常灵活方便. 外围模块通过核心提供的 Public API与核心进行通信, ...