String 类的字段,除了 hash 之外都声明为 final。所以,严格来说,Java 的字符串并不是不可变的。...不过,hash 字段缓存的值是根据其他字段计算而来的,而这些字段的值都是不可变的,因此,只要选定了字符串的内容,那么表现出来的行为就像是不可变的一样。...具有这种特性的类称为事实不可变的类——现实中很少见到这种类,程序员往往可以忽略真正不可变的数据和事实不可变的数据之间的区别。
众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢?可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...对象,但是再反射前后,这个String对象发生了变化, 也就是说,通过反射是可以修改所谓的“不可变”对象的。...但是一般我们不这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。
一、String为什么不可变? 要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。 final关键字可以修饰类、方法、字段。...二、String类不可变有什么好处? 最简单的就是为了安全和效率。...,提高执行效率; 总之,由于效率和安全问题,String被设计成不可变的,这也是一般情况下,不可变的类是首选的原因。...三String对象真的不可变吗? 从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。...但是一般我们不这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。
区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。...看下面代码: String s = "ABCabc"; System.out.println("s = " + s); s = "123456"; System.out.println("s...= " + s); 输出结果: s = ABCabc s = 123456 首先创建一个String对象s,然后让s的值为“ABCabc”, 然后又让s的值为“123456”。...那么怎么还说String对象是不可变的呢? 其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。
来源 | 简书| 作者 | 指尖上的榴莲 一.原理(为什么说String类是不可变的) 1.什么是不可变对象 如果一个对象在创建之后就不能再改变它的状态,那么这个对象是不可变的(Immutable)。...String类的不可变性,首先看一下String类中都有哪些成员变量。...所以String类不可变的关键都在底层的实现,而不仅仅是一个final。...也就是说,通过反射是可以修改String这种不可变对象的。...二.设计目标(为什么String要设计成不可变的) 在Java中,将String设计成不可变的是综合考虑到内存、同步、数据结构及安全等各种因素的结果,下文将为各种因素做一个小结。
String为什么是不可变的 我们通过查看String源码可以发现 String内部char数组是通过 private final修饰的,表示不可访问 而且String类也通过final修饰表示不可继承...这样做的目的是 保证了String类的线程安全,如果String可以改变,我们通过写一个类继承String 可以篡改数据 保证了hash属性值不会频繁变更,保证了唯一性,这也是HashMap采用String
String是不可变的吗?是的!真想变?也行~ 我们都知道,String是不可变对象,即一旦创建,那么就不能改变它的状态。对此,我们来分析一波。...String的内部构造 小心翼翼进入String的内部,我们可以看到它是一个final类,那么没人能继承它,很好,很丁克。...然后直接看向它的灵魂,一个char数组,也是final,于是我们知道它怎么不可变了。...String s2 = "abcd"; String s3 = new String("abcd"); String s4 = new String("abcd");...{ String s1 = "abcd"; String s2 = "abcd"; String s3 = new String("abcd");
一、不可变类简介 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。...四、String对象的不可变性 string对象在内存创建后就不可改变,不可变对象的创建一般满足以上5个原则,我们看看String代码是如何实现的。...这都符合上面总结的不变类型的特性,也保证了String类型是不可变的类。 五、String对象的不可变性的优缺点 从上一节分析,String数据不可变类,那设置这样的特性有什么好处呢?...六、String对象的是否真的不可变 虽然String对象将value设置为final,并且还通过各种机制保证其成员变量不可改变。但是还是可以通过反射机制的手段改变其值。...String的不可变特性主要为了满足常量池、线程安全、类加载的需求。合理使用不可变类可以带来极大的好处。
String对象 返回某个指定的字符串值在字符串中首次出现的位置 - indexOf() indexOf() 来定位字符串中某一个指定的字符首次出现的位置(从0开始),如果没找到对应的字符函数返回-1...var str4 = str.replace(/w/g, 'p') console.log(str4); //ppp.baidu.com 匹配 - match() match() 方法将检索字符串 String
1.什么是不可变? String不可变很简单,如下图,给一个已有字符串"abcd"第二次赋值成"abcedl*,不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。 2....String为什么不可变?...String类里的value用final修饰,只是说stack里的这个叫value的引用地址不可变。没有说堆里array本身数据不可变。...3.不可变有什么好处? 1.字符串常量池的需要 String常量池是方法区的一个特殊的储存区。...String string1 = "abcd"; String string2 = "abcd"; 来张图生动地解释下: 最后,设想一下,如果String可变,那么用某个引用一旦改变了字符串的值将会导致其他引用指向错误的值
前世今生 String不可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。...是个常量,从一出生就注定不可变。...我觉得到这里各位小伙们应该就知道为什么String不可变了,戴了个final的帽子,官方注释说明创建后不能被改变,但是为什么String要使用final修饰呢?...面试精选 在了解String不可变之前,我觉得有必要分析一道经典的面试题: public class Apple { public static void main(String[] args)...总结 了解到String是不可变的,知道了常量池是怎么个东西。 重温了面试题,有兴趣的小伙伴也可以去阅读下String的源码,浩浩荡荡的3000+。
String是Java中最常用的类,是不可变的(Immutable), 那么String是如何实现Immutable呢,String为什么要设计成不可变呢?...然后熟记String不可变定律的你肯定会反对。确实不是原对象,确实new了新String。同样的道理,在其他String的public方法里,都将new一个新的String。...this : new String(value, beginIndex, subLen); } 如果String是可变的,即修改String的内容后,地址不变。..." String会在加载class的时候需要,如果String可变,那么可能会修改加载中的类。...总之,安全性和String字符串常量池缓存是String被设计成不可变的主要原因。
面试官:讲讲 String、StringBuilder、StringBuffer 的区别 我:String 不可变,而 StringBuilder 和 StringBuffer 可变,叭叭叭 ........面试官:String 为什么不可变?...String 不可变的表现就是当我们试图对一个已有的对象 "abcd" 赋值为 "abcde",String 会新创建一个对象: ? String 为什么不可变?...于是,糟糕的事情发生了,HashSet 中出现了两个相等的元素,破坏了 HashSet 的不包含重复元素的原则。...没错,就是反射,使用反射可以直接修改 char 数组中的内容,当然,一般来说我们不这么做。 看下面代码: ?
可变性 简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,所以String 对象是不可变的。...因此,final 关键字修饰的数组保存字符串并不是 String 不可变的根本原因,因为这个数组保存的字符串是可变的(final 修饰引用类型变量的情况)。...String 真正不可变有下面几点原因: 保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。...String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。 相关阅读:如何理解 String 类型值的不可变?...参考资料 [1]如何理解 String 类型值的不可变?
我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。 ? 可以看出 String 类是 final 类型的,String 不能被继承。...其值 value 也就是对字符数组的封装,即 char[],其值被定义成 private final 的,说明不能通过外界修改,即不可变。 String 真的 "不可变 " 吗? 来看下面这个例子。...Java中的String真的是不可变吗? 所以说,这里的字符串并不是可变,只是变更了字符串引用。...String 真的真的真的 "不可变 " 吗? 上面的例子肯定是不可变的,下面这个就尴尬了。 ?...通过反射,我们改变了底层的字符数组的值,实现了字符串的 “不可变” 性,这是一种骚操作,不建议这么使用,违反了 Java 对 String 类的不可变设计原则,会造成一些安全问题。 是不是又涨姿势了?
今天我们来来聊聊String类型对象不可变的问题。 前言 String是Java中一个不可变的类,所以String对象一旦被实例化就无法被修改。我们知道Java中就是这样定义的。...String 类设计成不可变的原因及好处? 什么是不可变对象 从字面意思也能够理解,也就是我们的创建的对象不可改变。即,不可变类的实例一旦创建,其成员变量的值就不能被修改。...大家在 String 类的源码中能看到这个成员变量。把String实例设计为不可变的,那么该实例的成员变量hash也是不会变的。...如果是可变对象,那么多线程下,它的值很可能被其他线程改变,造成不可预期的结果。而不可变的 String 可以自由在多个线程之间共享,不需要同步处理。...ps:要是多细细思量,你会发现这个String类在开发中使用的地方真的是十分频繁! String类真的不可变吗? 既然有这个标题。那答案肯定就是可变。别忘了我们的反射机制。
Js中String对象 String全局对象是一个用于字符串或一个字符序列的构造函数。...方法 String.fromCharCode() String.fromCharCode(num1[, ...[, numN]]) String.fromCharCode()静态方法返回由指定的UTF...var s = String.fromCharCode(65, 66, 67); console.log(s); // ABC String.fromCodePoint() String.fromCodePoint...事实上,Js中基本数据类型的值不可变,基本类型的值一旦创建就不能被改变,所有操作只能返回一个新的值而不能去改变旧的值。...或从开始索引直到字符串的末尾的一个子集,参数indexStart需要截取的第一个字符的索引,该索引位置的字符作为返回的字符串的首字母,indexEnd可选,一个0到字符串长度之间的整数,以该数字为索引的字符不包含在截取的字符串内
在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题。...ok,下面我们来分析下为什么String是不可变的? 通过String源码可以看到,String类型的底层是由final修饰的char数组存储。...另一方面,如果String是可变的,那么同时运行的其他线程如果修改这个值,就有可能导致混乱。...(三)同步 由于String类型的不可变性,使得String对象可以安全的在多个线程之间传递和访问,也就是说你在多线程中是不能改变字符串本身的值,而是在堆里面新创建一个字符串然后操作。...总结: 本文主要介绍了Java语言里面String类型为什么设计成不可变类型,以及分析了不可变类型的带来的主要优势,需要注意的是虽然不可变类型能够带来不少的好处,但并不是说其没有弊端,不可变类型的每一次修改都需要在内存中新生成一个对象
什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...对象,但是再反射前后,这个String对象发生了变化, 也就是说,通过反射是可以修改所谓的“不可变”对象的。...但是一般我们不这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。
领取专属 10元无门槛券
手把手带您无忧上云