为什么不可变,回答这个问题,你就要理解把它设计为不可变的好处,String作为java中最常用的一种类,提供了很多操作方法。把它设计为final有以下好处:
1:稳定性和节省内存开销
final型会在jvm进行类加载的时候就直接进行实例化,这样就节省以后去不断new带来的内存开辟成本了。实例化后固定不可变了,这样它就是很稳定的。java程序员每天都在使用String,如果String不稳定,你想java最基本的操作还能实现吗?
2:防篡改
final是无法被继承的,这样它是独立存在的,自身封装的很好,就不会有子类去修改它本身的方法,不会有外界来打扰它,自身结构也不会被篡改了。
3:安全性:
这和它不能被继承这个息息相关,没有任何类可以继承它,就不会暴露给外部访问它内部方法的机会,这样它自身就比较安全了。
4:方便jvm优化
比如:String str1=“a"+"b"+1; String str2="ab1";为final的话,jvm就可以很方便的把str1的内容优化为str2,并指向同一个引用。这样就不用再去内存中new了。
当然还有很多好处了,java设计者这样做的根本目的就是为了保证java体系基本类的稳固和安全。
string操作的是字节序列(字符串长量)而不是字符串,所以不可以修改、删除、替换字符常量中的某个字符
需要理解String中有一个pool(池),还有String a="name";其实是这样的:String a=new String(“name”);上网查查详细资料就能来理解了。
String:
是对象不是原始类型.
为不可变对象,一旦被创建,就不能修改它的值.
对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
String 是final类,即不能被继承.
应该是想要知道的是String、StringBuffer、StringBuilder之间的区别
string是封装类,final类,不是最基本的数据类型,不可变
String 是不可变的,原因有以下几点:
安全性:参数通常String以网络连接,数据库连接URL,用户名/密码等形式表示。如果可变,则可以轻松更改这些参数。
同步和并发性:使String不可变自动使其线程安全,从而解决了同步问题。
缓存:当编译器优化你的String对象时,它会看到如果两个对象具有相同的值(a =“ test”和b =“ test”),因此你只需要一个字符串对象(对于a和b,这两个对象将指向同一对象)。
类加载:String用作类加载的参数。如果可变,则可能导致装入错误的类(因为可变对象更改其状态)。
话虽这么说,不变性String仅表示你无法使用其公共API对其进行更改。实际上,你可以使用反射来绕过常规API。在这里查看答案。