当前位置: 首页 > news >正文

String的不可变特性

1 问题

如何理解“String是不可变的,但是可以变”?

2 方法

(1)String的不可变特性体现在内容和长度

首先在idea中点开查看String这个类是如何定义的

4fc22f34cb8c9b950b62555b4c51a183.png

可以看到这样一行代码:private final char value[];

正是因为这个数组属性形成了String的不可变特性;

内容不可变是因为用private修饰的属性只能在String类的内部才能被访问

长度不可变是因为用final修饰的char[],由于数组创建时必须指定长度,一旦确定不能改变。且又有final修饰,所以数组的地址引用也不可以变。

(2)String可变是可以通过反射的机制去操作String对象中value属性的值;

import java.lang.reflect.Field;
public class Test01 {
   public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
       String s = "abc";
       System.out.println(s);
       //反射String类
       Class clazz = String.class;
       //找到私有属性
       Field field = clazz.getDeclaredField("value");
       field.setAccessible(true);
       //获取私有属性的值
       char[] value = (char[]) field.get(s);
       value[0]='1';
       value[1]='2';
       value[2]='3';
       System.out.println(s);
   }
}

运行代码后,打印第二次s的时候,输出的就是已经修改过后的"123"

3 结语

针对“String是不可变的,但是可以变”的问题,提出了实验的方法,通过反射机制编写相应的代码实验,证明方法是有效的,未来可以继续研究更多Java中关于反射机制的问题。

http://www.lryc.cn/news/61066.html

相关文章:

  • 使用MMDeploy(预编译包)转换MMxx(MMDeploy支持库均可)pth权重到onnx,并使用python SDK进行部署验证
  • Shiro安全框架简介
  • 三行Python代码,让数据处理速度提高2到6倍
  • 空间向量模长
  • 活动需求中灵活使用Redis提升生产力
  • Java知识点学习(第16天)
  • ORA-1688: unable to extend table AUDSYS.AUD$UNIFIED
  • 抖音滑块以及轨迹分析
  • C#生成单色bmp图片,转为单色bmp图片 任意语言完全用字节拼一张单色图,LCD取模 其它格式图片转为单色图
  • 【瑞吉外卖】002 -- 后台登录功能开发
  • 【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)
  • java IO流_1
  • 【回忆 总结】我的大学四年
  • 深度解析OEKO
  • Golang gorm
  • rk3568 适配摄像头 (CIF协议)
  • 今天面试招了个25K的测试员,从腾讯出来的果然都有两把刷子···
  • Redis---集群环境准备
  • 数据结构考研版——队列的配置问题
  • 【SOAP-WebService系列】SOAP学习笔记
  • 材料科学|名词解释终版!!!
  • 永久免费内网穿透不限制速度
  • JAVA开发运维(云基础设备监控)
  • 现在备考2023年5月软考网络工程师时间够吗?
  • webp怎么转换成png,4个方法教你快速处理
  • 程序员能干多久?程序员能干到多大年龄?
  • 采购系统是如何管理供应商的?
  • Linux学习笔记(2)--一些内核接口
  • 学习风`宇博客用户权限菜单模块
  • centos7.6部署ELK集群(一)之elasticsearch7.7.0集群部署