摘要:的不变性,如下图所示,当你改变了的之后指向了一个新的对象原对象不做改变。但其引用的数组是可变的。所以的不可变性的关键并不是的作用。同时编写者为了避免因为的不可变性导致占用大量空间,为此设计了字符串常量池
在猫眼的面试中被面试官问到为什么String的字符串是不变的。当时我的回答是因为String类是用final关键字修饰的,当被问到为什么用 final修饰就是不可变的时候我发现自己说的并没有什么道理。之后自己专门查了一下为什么。
String的不变性,如下图所示,当你改变了s的之后s指向了一个新的对象原对象不做改变。
看一下源码是怎么实现的:
我们看到String被定义为final,所以说String是不可继承的,接着我们看到String的内部实现是一个char数组,并且定义为final。这时有些人可能认为final修饰的字段创建以后就不可改变,所以就完了,但其实不是这样的。
因为虽然value是不可变,也只是value这个引用地址不可变。但其引用的Array数组是可变的。
final int[] value={1,2,3}; value[2]=100; //这时候数组里已经是{1,2,100}
所以根本上String是不可变的原因是sun工程师很好的封装了value数组,在其中所有的方法中不去更改value数组,并把它定义为private,并且把整个String设成final禁止继承,避免被其他人继承后破坏。所以String的不可变性的关键并不是final的作用。
同时Java编写者为了避免因为String的不可变性导致占用大量空间,为此设计了字符串常量池
String one = "someString"; String two = "someString";
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73853.html
摘要:整个这个雷区面板都是由的和组成的,最后由的方法对其进行不可变化处理剩下的主要逻辑部分就是扫雷了,传入扫雷游戏对象一个不可变结构做为第一个参数,以及要扫的那个雷区块对象,最后返回新的扫雷游戏实例。 不可变性(Immutability)是函数式编程的核心原则,在面向对象编程里也有大量应用。在这篇文章里,我会给大家秀一下到底什么是不可变性(Immutability)、她为什么还这么屌、以及在...
摘要:但是通过构造函数的并不是。通过构造函数创建的变量在机制上与其他对象一致,都是在上创建新的对象,然后把引用赋给变量。此外,的方法和等方法实现均是调用了构造函数创建了新的对象,所以他们返回的也都是存在于上的新对象。 String经常在一个语言中或多或少都有些特殊地位。在Java亦不例外。今天先来讨论,String是不可变的。 String是引用类型,String变量储存一个地址,地址指向内...
摘要:不少语言对字符串的实现,都采用了限定不变性。字符串的不可变性有不少好处,但是如果程序员忘了这一点也会导致问题。所以字符串不可变就是存储的代价。另一个场景是字符串可以用于哈希表的键,而键是不可以改变值的。 像是js,以及c#等一系列的语言,推出任何一个特征都要和c比一比,你知道的:)。 string的不可变性也是一样,你看: C的string是可以改变的。 你可以 char str...
摘要:文本已收录至我的仓库,欢迎记录一次在写代码时愚蠢的操作,本文涉及到的知识点不可变性一交代背景我这边有一个系统,提供一个接口去发送短信。 前言 只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 记录一次在写代码时愚蠢的操作,本文涉及到的知识点:String不可变性 一、交代背景 我这边有一个系统,...
摘要:但在开始之前应该心中有数值的不可变性并不是说我们不能在程序编写时不改变某个值。这些都是对值的不可变这个概念的误解。程序的其他部分不会影响的赋值。 原文地址:Functional-Light-JS 原文作者:Kyle Simpson-《You-Dont-Know-JS》作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTML 最坚实的梁柱;分享,是 CSS 里最闪...
阅读 1728·2021-09-23 11:34
阅读 2423·2021-09-22 15:45
阅读 12568·2021-09-22 15:07
阅读 2167·2021-09-02 15:40
阅读 4059·2021-07-29 14:48
阅读 1034·2019-08-30 15:55
阅读 3218·2019-08-30 15:55
阅读 2169·2019-08-30 15:55