专业的JAVA编程教程与资源

网站首页 > java教程 正文

String为什么不可变(string 为什么不可变)

temp10 2024-10-28 19:34:22 java教程 7 ℃ 0 评论

大家好,我是贠学文,点击右上方“关注”,每天为您分享java程序员需要掌握的知识点干货。

我们都知道,在java中,String类型是不可变的,但是大家有没有想过,它为什么是不可变的呢?以及它是如何实现不可变的呢?

String为什么不可变(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开发工程师,业余时间利用头条分享技术知识点与自己对技术的感悟,帮助对自己未来感到迷茫的程序员,在技术上得到提升。结识一些志同道合的朋友,相互促进,共同进步。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表