wordpress外贸网站增加个博客栏,信誉楼线上商城小程序,网页制作教程菜鸟,东丽区做网站这几天在各大平台上都看到过这样一些帖子#xff0c;全都是关于String类型对象不可变的问题#xff0c;当然现在也是找工作的准备时期#xff0c;因此花了一部分时间对其进行整理一下。想要完全了解String#xff0c;在这里我们需要解决以下几个问题(1)什么是不可变对象全都是关于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的类型保存如果你将密码以明文的形式保存成字符串那么它将一直留在内存中直到垃圾收集器把它清除。而由于字符串被放在字符串缓冲池中以方便重复使用所以它就可能在内存中被保留很长时间而这将导致安全隐患第三字符串值是被保留在常量池中的也就是说假若字符串对象允许改变,那么将会导致各种逻辑错误