java string char数组_String在Java中真的是不可变吗?
我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0.........}
可以看出 String 类是 final 类型的,String 不能被继承。其值 value 也就是对字符数组的封装,即 char[],其值被定义成 private final 的,说明不能通过外界修改,即不可变。
String 真的 “不可变 “ 吗?
来看下面这个例子:
String str = "hello";
System.out.println(str); // hellostr = "world";
System.out.println(str); // worldstr = str.substring(1);
System.out.println(str); // orld
你有可能会问:str 不是由 hello 变成 world 了吗?然后通过 substring 方法变成 orld 了吗?
这其实是初学者的一个误区,从上面看 String 的结构可以得知字符串是由字符数组构成的,str 只是一个引用而已,第一次引用了 “hello”,后面变成了 “world”,而 substring 也是用 Arrays.copyOfRange 方法重新复制字符数组构造了一个新的字符串。
所以说,这里的字符串并不是可变,只是变更了字符串引用。
String 真的真的真的 “不可变 “ 吗?
上面的例子肯定是不可变的,下面这个就尴尬了:
String str = "Hello world";
System.out.println(str); // Hello worldField field = String.class.getDeclaredField("value");
field.setAccessible(true);char[] value = (char[])field.get(str);
value[6] = 'J';
value[7] = 'a';
value[8] = 'v';
value[9] = 'a';
value[10] = '!';
value[11] = '!';
System.out.println(str); // Hello Java!!
通过反射,我们改变了底层的字符数组的值,实现了字符串的 “不可变” 性,这是一种骚操作,不建议这么使用,违反了 Java 对 String 类的不可变设计原则,会造成一些安全问题。
是不是又涨姿势了?
java string char数组_String在Java中真的是不可变吗?相关推荐
- java String转数组||String转集合||将字符串转化为数组
java String转数组||String转集合||将字符串转化为数组 如果你和我一样你们公司有人这样存数据的话 这就很气人,如果用分割的方法的话 还需要去除前后两个中括号,还有两个双引号要分割,气 ...
- JAVA String转数组,Json转数组
json格式{"value":["3d55f2a141e84394abf6e98b9de8f8fa"]} import org.json.simple.JSON ...
- java二维数组的创建,java二维数组创建方法
java动态创建二维数组,从零学java笔录-第31篇 图解二位数组在内存中存储,java二维数组动态赋值,java二维数组创建方法 二维数组的定义 type arrayName[ ][ ]; typ ...
- java string对象创建_String对象创建个数
s = new String("xyz");创建了几个String Object?两个对象,一个是"xyx",一个是指向"xyx"的引用对象 ...
- java string最大长度_一个Java字符串中到底有多少个字符?
作者:鸟窝 依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 (0),最大值是(65535), 也就是一个字符以2个字节来表示,难道Java最多只能表示 65535个 ...
- java string 大小空间_String的长度和储存大小
在cpp中为了可移植性,string的长度是string::size_type,突然就想知道java允许的最大字符串长度为多少.看String的源码: publicfinalclassString11 ...
- char 数组java_使用Java char数组处理C char数组
通过套接字,我将信息从用C编写的程序发送到用Java编写的程序. 通过C中的程序,我通过char数组(使用Internet套接字)发送两个字节,并且Java中接收的信息也存储在char数组中. 我的主 ...
- java抛出数组格式异常,Java中异常
一.异常的概述 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 二.异常的继承体系和错误的区别 1.异常的继承体系 Thr ...
- 2021-12-27 Java String contains() 方法用于判断字符串中是否包含指定的字符或字符串。用.toLowerCase().contains忽视大小写。
一.public boolean contains(CharSequence chars) contains() 方法用于判断字符串中是否包含指定的字符或字符串. 二.返回值 如果包含指 ...
最新文章
- nagios+sendmail配置
- python requests post请求_实例解析Python3 如何利用requests 库进行post携带账号密码请求数据...
- 配置远程服务器jupyter
- Java实战应用50篇(二)-SSM框架中的设计模式:动态代理
- iframe 自适应高度 [记录]
- Charles+Android模拟器里抓http请求(配置模拟器教程)
- iLO4外网访问时不能启动控制台
- Codeforces Round #732 (Div. 2) D. AquaMoon and Chess 组合数学 + 找规律
- 论赵泽彬多终端应⽤下的架构设计
- jvm感知docker容器参数
- Datagridview绘制
- 自我觉察-3:发现-我这么做究竟为了什么?
- android gone动画_Android动画之淡入淡出
- php面试 算法,PHP面试之常用算法 - 简庆旺个人博客|PHP教程|PHP学习|Python学习|Python教程|Seo学习|Seo教程...
- Linux操作Oracle(6)——Oracle11g OPatch 打补丁全纪录【Oracle11g windowsX64位环境+OPatch11.2.0.3.28】及资源下载
- Bzoj4556 [Tjoi2016Heoi2016]字符串
- Codeforces Round #535 (Div. 3) 解题报告
- 阿里—最新iOS面试题总结
- 超详细!联想小新700黑苹果双系统完整教程(1)
- 用于单眼3D物体检测的可学习深度引导卷积
热门文章
- Spring Cloud Stream多RabbitMQ实例配置时报错no default binder has been set
- Python根据正则表达式找到相应的字符串然后进行替换
- MySQL实时获取有性能问题的SQL
- Oracle sqlplus使用总结
- 订阅者java,RxJava:“ java.lang.IllegalStateException:只允许一个订阅者!”
- 《Android Studio开发实战 从零基础到App上线(第2版)》出版后记
- Android开发笔记(二十一)横幅轮播页Banner
- 照葫芦画瓢之老男孩购物车程序
- 加拿大程序员趣闻系列 1/N
- 在SPS中直接查看用HTML格式阅读Office文档