我们都知道 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中真的是不可变吗?相关推荐

  1. java String转数组||String转集合||将字符串转化为数组

    java String转数组||String转集合||将字符串转化为数组 如果你和我一样你们公司有人这样存数据的话 这就很气人,如果用分割的方法的话 还需要去除前后两个中括号,还有两个双引号要分割,气 ...

  2. JAVA String转数组,Json转数组

    json格式{"value":["3d55f2a141e84394abf6e98b9de8f8fa"]} import org.json.simple.JSON ...

  3. java二维数组的创建,java二维数组创建方法

    java动态创建二维数组,从零学java笔录-第31篇 图解二位数组在内存中存储,java二维数组动态赋值,java二维数组创建方法 二维数组的定义 type arrayName[ ][ ]; typ ...

  4. java string对象创建_String对象创建个数

    s = new String("xyz");创建了几个String Object?两个对象,一个是"xyx",一个是指向"xyx"的引用对象 ...

  5. java string最大长度_一个Java字符串中到底有多少个字符?

    作者:鸟窝 依照Java的文档, Java中的字符内部是以UTF-16编码方式表示的,最小值是 (0),最大值是(65535), 也就是一个字符以2个字节来表示,难道Java最多只能表示 65535个 ...

  6. java string 大小空间_String的长度和储存大小

    在cpp中为了可移植性,string的长度是string::size_type,突然就想知道java允许的最大字符串长度为多少.看String的源码: publicfinalclassString11 ...

  7. char 数组java_使用Java char数组处理C char数组

    通过套接字,我将信息从用C编写的程序发送到用Java编写的程序. 通过C中的程序,我通过char数组(使用Internet套接字)发送两个字节,并且Java中接收的信息也存储在char数组中. 我的主 ...

  8. java抛出数组格式异常,Java中异常

    一.异常的概述 在Java中,把异常信息封装成了一个类.当出现了问题时,就会创建异常类对象并抛出异常相关的信息(如异常出现的位置.原因等). 二.异常的继承体系和错误的区别 1.异常的继承体系 Thr ...

  9. 2021-12-27 Java String contains() 方法用于判断字符串中是否包含指定的字符或字符串。用.toLowerCase().contains忽视大小写。

    一.public boolean contains(CharSequence chars) contains() 方法用于判断字符串中是否包含指定的字符或字符串. 二.返回值        如果包含指 ...

最新文章

  1. nagios+sendmail配置
  2. python requests post请求_实例解析Python3 如何利用requests 库进行post携带账号密码请求数据...
  3. 配置远程服务器jupyter
  4. Java实战应用50篇(二)-SSM框架中的设计模式:动态代理
  5. iframe 自适应高度 [记录]
  6. Charles+Android模拟器里抓http请求(配置模拟器教程)
  7. iLO4外网访问时不能启动控制台
  8. Codeforces Round #732 (Div. 2) D. AquaMoon and Chess 组合数学 + 找规律
  9. 论赵泽彬多终端应⽤下的架构设计
  10. jvm感知docker容器参数
  11. Datagridview绘制
  12. 自我觉察-3:发现-我这么做究竟为了什么?
  13. android gone动画_Android动画之淡入淡出
  14. php面试 算法,PHP面试之常用算法 - 简庆旺个人博客|PHP教程|PHP学习|Python学习|Python教程|Seo学习|Seo教程...
  15. Linux操作Oracle(6)——Oracle11g OPatch 打补丁全纪录【Oracle11g windowsX64位环境+OPatch11.2.0.3.28】及资源下载
  16. Bzoj4556 [Tjoi2016Heoi2016]字符串
  17. Codeforces Round #535 (Div. 3) 解题报告
  18. 阿里—最新iOS面试题总结
  19. 超详细!联想小新700黑苹果双系统完整教程(1)
  20. 用于单眼3D物体检测的可学习深度引导卷积

热门文章

  1. Spring Cloud Stream多RabbitMQ实例配置时报错no default binder has been set
  2. Python根据正则表达式找到相应的字符串然后进行替换
  3. MySQL实时获取有性能问题的SQL
  4. Oracle sqlplus使用总结
  5. 订阅者java,RxJava:“ java.lang.IllegalStateException:只允许一个订阅者!”
  6. 《Android Studio开发实战 从零基础到App上线(第2版)》出版后记
  7. Android开发笔记(二十一)横幅轮播页Banner
  8. 照葫芦画瓢之老男孩购物车程序
  9. 加拿大程序员趣闻系列 1/N
  10. 在SPS中直接查看用HTML格式阅读Office文档