java语言特点 字符串不变_面试必问:Java中String类型为什么设计成不可变的?
这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下。
想要完全了解String,在这里我们需要解决以下几个问题
(1)什么是不可变对象?
(2)String如何被设计成不可变对象的?
(3)有什么办法能够改变String?
(4)JAVA语言为什么把String类型设计成不可变?
带着这些问题就可以开始今天的文章了。
一、什么是不可变对象
从字面意思也能够理解,也就是我们的创建的对象不可改变。那什么是不可变呢?为了实现创建的对象不可变,java语言要求我们需要遵守以下5条规则:
(1)类内部所有的字段都是final修饰的。
(2)类内部所有的字段都是私有的,也就是被private修饰。
(3)类不能够被集成和拓展。
(4)类不能够对外提供哪些能够修改内部状态的方法,setter方法也不行。
(5)类内部的字段如果是引用,也就是说可以指向可变对象,那我们程序员不能获取这个应用。
正是由于我们的String类型遵循了上面5条规则,所以才说String对象是不可变的。想要去了解他还是看看String类型内部长什么样子再来看上面5条规则吧。
二、String如何被设计成不可变对象的
1、疑惑一
在看之前,我们先给出一个疑惑问题,我们看下面的代码,
在文章一开始我们就说了,String对象是不可变的,这里a=张三,然后a=李四,这符合String的不可变性嘛?答案是当然符合。
从上面这张图我们可以看到,在第一次String a="张三"的时候,在堆中创建了同一个对象“张三”。后来我们在执行a="李四"的时候再内存中又创建了一个对象“李四”。也就是说我们的a仅仅只是改变了引用a指向的地址而已。
2、源码解释疑惑
既然a指向的引用地址改变了,那么其String内部肯定有一个变量,能够指向不同的实际对象,想要进一步弄清楚我们就进入其String的内部来看看。
我们在这里主要通过String类的源码来分析,看一下Java语言是如何设计,能把String类型设计成不可变的。这里给出的是jdk1.8的一部分源码。
上面最主要的是两个字段:value和hash。我们在这里主要是看value数组,hash和主题无关所以这里不再讲解了,我有专门的文章介绍hash。
我们的String对象其实在内部就是一个个字符然后存储在这个value数组里面的。但是value对外没有setValue的方法,所以整个String对象在外部看起来就是不可变的。我们画一张图解释一下上面的疑惑
现在明白了吧,也就是说真正改变引用的是value,因为value也是一个数组引用。这也可以很方便的解释下一个疑惑问题了。
3、疑惑二
既然我们的String是不可变的,好像内部还有很多substring, replace, replaceAll这些操作的方法。好像都是对String对象改变了,解释起来也很简单,我们每次的replace这些操作,其实就是在堆内存中创建了一个新的对象。然后我们的value指向不同的对象罢了。
面试的时候我们只是解释上面的原因其实不是那么尽善尽美,想要更好的去加薪去装逼,我们还需更进一步回答。
三、有什么办法能够改变String
既然有这个标题。那肯定就是有办法的,别忘了我们的反射机制,在通常情况下,他可以做出一些违反语言设计原则的事情。这也是一个技巧,每当面试官问一些违反语言设计原则的问题,你就可以拿反射来反驳他。下面我们来看一下:
我们可以通过反射来改变String。
现在我们知道它的原理以及用法,也知道可以通过反射来改变String,还有一个问题我们没有弄清楚,面试的时候你也可以反问他,来进一步提升自己的逼格。
四、JAVA语言为什么把String类型设计成不可变
这里有几个特点。
第一:在Java程序中String类型是使用最多的,这就牵扯到大量的增删改查,每次增删改差之前其实jvm需要检查一下这个String对象的安全性,就是通过hashcode,当设计成不可变对象时候,就保证了每次增删改查的hashcode的唯一性,也就可以放心的操作。
第二:网络连接地址URL,文件路径path通常情况下都是以String类型保存, 假若String不是固定不变的,将会引起各种安全隐患。就好比我们的密码不能以String的类型保存,,如果你将密码以明文的形式保存成字符串,那么它将一直留在内存中,直到垃圾收集器把它清除。而由于字符串被放在字符串缓冲池中以方便重复使用,所以它就可能在内存中被保留很长时间,而这将导致安全隐患
第三:字符串值是被保留在常量池中的,也就是说假若字符串对象允许改变,那么将会导致各种逻辑错误
java语言特点 字符串不变_面试必问:Java中String类型为什么设计成不可变的?相关推荐
- java中数组的返回值是什么类型_面试必问:Java中String类型为什么设计成不可变的?...
这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下. 想要完全了解String,在这里我们需要解决以下 ...
- string replace_面试必问:String类型为什么设计成不可变的?
这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下. 想要完全了解String,在这里我们需要解决以下 ...
- golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理
1 01 引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发). 1.1 进程和 ...
- java项目不要用反射_面试官:Java 反射是什么?我回答不上来!
一.概念 反射就是把Java的各种成分映射成相应的Java类. Class类的构造方法是private,由JVM创建. 反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检 ...
- 面试必问---Java线程池8大拒绝策略
前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发.而不论你用Fix ...
- 生成唯一字符串算法_面试官问:在分布式场景,生成唯一ID,你有几种方案?...
来源:http://t.cn/RG0AW0a 说明:本文代码采用C#,重要的是理解解决方案,代码实现都是次要的. 系统唯一ID是我们在设计一个系统的时候常常会遇见的问题,也常常为这个问题而纠结.生成I ...
- java语言的命题原则_重庆自考《Java语言程序设计(一)》课程全国统一命题考试说明...
为组织好高等教育自学考试<Java语言程序设计(一)>课程的全国统一考试命题工作,根据全国统一命题课程的有关规定,特制定本说明. 一.考试原则 1.考试标准 本课程考试参照全日制普通高校同 ...
- security面试_面试必问41道 SpringBoot 面试题,不看亏大了!
来源:阿凯的帽子反戴 原:blog.csdn.net/Kevin_Gu6/article/details/88547424 今天跟大家分享下SpringBoot 常见面试题的知识. 1 什么是spri ...
- java语言开发手机游戏_手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系...
手机上的JAVA游戏和JAVA软件,是电脑上的JAVA语言编写的吗?他们之间有什么联系以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...
最新文章
- python-pptx
- 协议地址结构_通信之路——用最简洁的文字告诉你互联网协议TCP/IP
- Python 之Re模块(正则表达式)
- libc++abi.dylib: terminate_handler unexpectedly
- 001-SDK框架之Unity游戏调用SDK
- java中文 x_java环境url中文参数乱码处理
- POJ 3233 Matrix Power Series (矩阵分块,递推)
- 第二十一届国际C语言混乱代码大赛结果公布
- 计算机中国象棋书籍,[建议]中国的象棋永远不能被没有“思维”的电脑所代替(就目前的电脑象棋软件...
- 2021年信用卡行业发展报告
- VC6和VS2005(及2010)的一些区别总结
- 计算机仿真期末考试,2015年数学物理建模期末考试试题.docx
- 下载anaconda后配置环境变量
- websocket实现实时直播
- 数据库知识与技巧日常汇总
- Postman汉化中文版
- 聚米移动广告平台——广告主不可错过的投放选择
- 马斯克遭黑客组织“匿名者”威胁,怒斥其为自恋狂
- 2018 Arab Collegiate Programming Contest (ACPC 2018) H - Hawawshi Decryption 数学 + BSGS
- 思科模拟器8.1版本身份验证失败禁用网络解决
热门文章
- html绘制波形图,JS实现波形图
- threejs骨架形状
- margin background_margin:auto与布局展示
- 建立远程桌面连接计算机无密码,win7远程桌面空密码的步骤_win7系统如何设置让远程桌面登录无需密码-win7之家...
- 那些地方会用C语言多线程,如何用C语言实现多线程
- TSubclassOf
- warning no newline at the end of file
- half-sync/half-async 和 Leader/Followers 模式的主要区别
- 图解WinCE6.0下的内核驱动和用户驱动
- php二维码存放json数据_PHP生成及获取JSON文件的方法