首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

STRING对象不可变的原理

众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢?可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...对象,但是再反射前后,这个String对象发生了变化, 也就是说,通过反射是可以修改所谓的“不可变”对象的。...但是一般我们这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。

66740
您找到你想要的搜索结果了吗?
是的
没有找到

String类不可变分析以及普通不可变

一、String为什么不可变? 要了解String类创建的实例为什么不可变,首先要知道final关键字的作用:final的意思是“最终,最后”。 final关键字可以修饰类、方法、字段。...二、String类不可变有什么好处? 最简单的就是为了安全和效率。...,提高执行效率; 总之,由于效率和安全问题,String被设计成不可变的,这也是一般情况下,不可变的类是首选的原因。...三String对象真的不可变吗? 从上文可知String的成员变量是private final 的,也就是初始化之后不可改变。...但是一般我们这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。

60730

JAVA不可变类(immutable)机制与String的不可变

一、不可变类简介 不可变类:所谓的不可变类是指这个类的实例一旦创建完成后,就不能改变其成员变量值。如JDK内部自带的很多不可变类:Interger、Long和String等。...四、String对象的不可变string对象在内存创建后就不可改变,不可变对象的创建一般满足以上5个原则,我们看看String代码是如何实现的。...这都符合上面总结的不变类型的特性,也保证了String类型是不可变的类。 五、String对象的不可变性的优缺点 从上一节分析,String数据不可变类,那设置这样的特性有什么好处呢?...六、String对象的是否真的不可变 虽然String对象将value设置为final,并且还通过各种机制保证其成员变量不可改变。但是还是可以通过反射机制的手段改变其值。...String的不可变特性主要为了满足常量池、线程安全、类加载的需求。合理使用不可变类可以带来极大的好处。

1.6K20

聊聊JAVA中 String类为什么不可变

前世今生 String可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。...是个常量,从一出生就注定不可变。...我觉得到这里各位小伙们应该就知道为什么String可变了,戴了个final的帽子,官方注释说明创建后不能被改变,但是为什么String要使用final修饰呢?...面试精选 在了解String可变之前,我觉得有必要分析一道经典的面试题: public class Apple { public static void main(String[] args)...总结 了解到String是不可变的,知道了常量池是怎么个东西。 重温了面试题,有兴趣的小伙伴也可以去阅读下String的源码,浩浩荡荡的3000+。

39410

聊聊JAVA中 String类为什么不可变

前世今生 String可变这个话题应该是老生长谈了,你可以说它就是设计者的龟腚,然后巴拉巴拉说出一大堆优点,也可以说它忠于爱情,只要JVM存活,它便万年不变。...是个常量,从一出生就注定不可变。...我觉得到这里各位小伙们应该就知道为什么String可变了,戴了个final的帽子,官方注释说明创建后不能被改变,但是为什么String要使用final修饰呢?...面试精选 在了解String可变之前,我觉得有必要分析一道经典的面试题: public class Apple { public static void main(String[] args)...总结 了解到String是不可变的,知道了常量池是怎么个东西。 重温了面试题,有兴趣的小伙伴也可以去阅读下String的源码,浩浩荡荡的3000+。

753190

Java 中的 String 真的是不可变吗?

我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码。 ? 可以看出 String 类是 final 类型的,String 不能被继承。...其值 value 也就是对字符数组的封装,即 char[],其值被定义成 private final 的,说明不能通过外界修改,即不可变String 真的 "不可变 " 吗? 来看下面这个例子。...Java中的String真的是不可变吗? 所以说,这里的字符串并不是可变,只是变更了字符串引用。...String 真的真的真的 "不可变 " 吗? 上面的例子肯定是不可变的,下面这个就尴尬了。 ?...通过反射,我们改变了底层的字符数组的值,实现了字符串的 “不可变” 性,这是一种骚操作,建议这么使用,违反了 Java 对 String 类的不可变设计原则,会造成一些安全问题。 是不是又涨姿势了?

85620

必知必会:String可变的3个好处

今天我们来来聊聊String类型对象不可变的问题。 前言 String是Java中一个不可变的类,所以String对象一旦被实例化就无法被修改。我们知道Java中就是这样定义的。...String 类设计成不可变的原因及好处? 什么是不可变对象 从字面意思也能够理解,也就是我们的创建的对象不可改变。即,不可变类的实例一旦创建,其成员变量的值就不能被修改。...大家在 String 类的源码中能看到这个成员变量。把String实例设计为不可变的,那么该实例的成员变量hash也是不会变的。...如果是可变对象,那么多线程下,它的值很可能被其他线程改变,造成不可预期的结果。而不可变String 可以自由在多个线程之间共享,不需要同步处理。...ps:要是多细细思量,你会发现这个String类在开发中使用的地方真的是十分频繁! String类真的不可变吗? 既然有这个标题。那答案肯定就是可变。别忘了我们的反射机制。

22510

JsString对象

JsString对象 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到字符串长度之间的整数,以该数字为索引的字符包含在截取的字符串内

7.6K20

为什么Java里面String类是不可变

在Java里面String类型是不可变对象,这一点毫无疑问,那么为什么Java语言的设计者要把String类型设计成不可变对象呢?这是一个值得思考的问题。...ok,下面我们来分析下为什么String是不可变的? 通过String源码可以看到,String类型的底层是由final修饰的char数组存储。...另一方面,如果String可变的,那么同时运行的其他线程如果修改这个值,就有可能导致混乱。...(三)同步 由于String类型的不可变性,使得String对象可以安全的在多个线程之间传递和访问,也就是说你在多线程中是不能改变字符串本身的值,而是在堆里面新创建一个字符串然后操作。...总结: 本文主要介绍了Java语言里面String类型为什么设计成不可变类型,以及分析了不可变类型的带来的主要优势,需要注意的是虽然不可变类型能够带来不少的好处,但并不是说其没有弊端,不可变类型的每一次修改都需要在内存中新生成一个对象

69340

Java中的String为什么是不可变的?

什么是不可变对象? 众所周知, 在Java中, String类是不可变的。那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。...区分对象和对象的引用 对于Java初学者, 对于String是不可变对象总是存有疑惑。...为什么String对象是不可变的? 要理解String的不可变性,首先看一下String类中都有哪些成员变量。...对象,但是再反射前后,这个String对象发生了变化, 也就是说,通过反射是可以修改所谓的“不可变”对象的。...但是一般我们这么做。这个反射的实例还可以说明一个问题:如果一个对象,他组合的其他对象的状态是可以改变的,那么这个对象很可能不是不可变对象。

66330
领券