技术文章

为什么String在java中是不可变的?

String类在Java中被设计成不可变的,这是Java开发人员大家都知道的事情。但是要让大家真的说出来为什么String在Java中是不可变的,有时候真的能让人一时语塞,或者说的不够全面。这个问题有各种提问的方式,例如:“为什么Java中要把String类设计成不可变的?”,“String类被设计成不可变类有什么好处?”基本上都是一个思路。

接下来个人从以下几个方面来谈谈自己对这个问题的看法:

什么是不可变?

《Effective Java》中对于不可变类的解释如下:

为什么String在java中是不可变的

不可变带来的好处 多线程安全:不可变对象天生多线程安全。因为不可变对象不会被改变,所以它们可以被多线程共享,不需要增加额外的同步操作。
字符串池:
为什么String在java中是不可变的

上面的代码只会创建一个对象实例到Java Heap中,当创建str1时候,会去字符串池中查看是否已经有了这个字符串,如果有,那么把str1的引用直接指向这个字符串实例上去,这样便极大的节省了内存空间的使用。如果字符串可变的话,那么修改了其中一个对象,就会影响另外一个。

缓存HashCode

为什么String在java中是不可变的

当我们创建了一个字符串对象时候,便生成了它的HashCode,因为是不可变,所以生成之后便可以缓存起来,这样用于HashMap中的key,便大大提高了查询的速度。还有我们的Set集合,大家都知道Set集合是不可重复的集合,String类的不可变很好的支持了Set集合的设计思想。 String类是基石

正是因为有了以String类为代表的这些不可变类,才能为其他对象的构建提供了极大的便利,想想我们在编写Java程序的时候,是不是大量的使用了String类。

以上,就是我个人对Java中为什么String类是不可变的几点看法,大家还有什么更好的见解?欢迎讨论交流,批评指正~