网站首页 > java教程 正文
大家好,我是贠学文,点击右上方“关注”,每天为您分享java程序员需要掌握的知识点干货。
我们都知道,在java中,String类型是不可变的,但是大家有没有想过,它为什么是不可变的呢?以及它是如何实现不可变的呢?
一.String类型为什么是不可变的
1.String是我们在编码中用到的最多的类型,在jvm运行期间,会频繁的创建String对象,这样势必会对效率产生影响,也会严重的浪费内存空间,所以为了避免这个问题,jvm提供了String常量池,但是常量池能够实现的前提,就是要求String一定是不可变的,否则常量池是无法实现的。
2.从安全性的角度考虑,我们在日常编码中,对于一些非常重要的数据,都会用String类型来存储,比如:URL、ip、用户名、密码等等,如果String是可变的,黑客就可以对这些重要数据做修改,产生严重的安全问题。
二.String是如何实现不可变的
1.String底层是用char数组实现的,并且将char数组用final修饰,这样可以保证char数组对象的引用不会重新指向其他对象,但是这里仅仅是保证了引用不会指向其他对象而已,数组本身的内容还是可以改变的,所以为了避免这种情况的发生,在String类中,所有对数组操作的方法,都没有对数组本身做修改,而是重新创建了一个String对象。
2.将char数组用private修饰,这样可以避免其他类对char数组对象做修改。
3.将String类用final修饰,这样可以避免其他类去继承String类,对String类造成破坏。
String类用上面的三种方式,来保证它是不可变的,但是它也不是绝对的不可变的,我们依然可以用反射来改变它,只是我们在平时写代码时,会严禁这样使用而已。
下面的图片就是利用反射来改变String的一个例子,大家可以尝试运行一下它的结果,是不是会感到很吃惊呢,为什么和我们预期的结果不一致呢?这就涉及到String常量池的原因了,下一期,会讲下String常量池,并揭晓这个运行结果的原因。
往期精彩:
作者介绍:
贠学文,具有多有经验的java开发工程师,业余时间利用头条分享技术知识点与自己对技术的感悟,帮助对自己未来感到迷茫的程序员,在技术上得到提升。结识一些志同道合的朋友,相互促进,共同进步。
猜你喜欢
- 2024-10-28 JDK8 新特性之新的日期&时间API,一篇讲清楚!
- 2024-10-28 日期时间API之TemporalAdjusters与TemporalAdjuster
- 2024-10-28 四十五、Date与Calendar类在日期与时间处理中的关键作用
- 2024-10-28 深入解析Java中的String.format():格式化输出的艺术
- 2024-10-28 JAVA开发中使用Duration类设置时间长度
- 2024-10-28 DATE #4、Java操作日期时间-④.自定义时间调节器-放假通知
- 2024-10-28 Java学习笔记:String字符串格式化
- 2024-10-28 Java 计算日期属于当月第几周(日期周计算)
- 2024-10-28 GO项目实战—Gorm格式化时间字段(mongo时间格式化)
- 2024-10-28 读Java实战(第二版)笔记06_新的日期和时间API
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)