为何写这篇文章。因为string在开发中用的实在是太多了。
对于string为何要设计为常量,在内存中的存储等知识都有点不一样。
做个记录,算是自己的一点思考。
问题1:string为何设计为不变常量?
引用java核心技术作者的原话:java设计者认为string的不可能性带来的共享高效率优于可变的低效率。
人话:不可变可以带来字符串的共享。效率和安全性。
安全性的说法是:多线程操作的时候,对这种不可变的数据不进行锁的操作,如果可变,则会多一些操作,安全性更差。当然不一定是多线程操作,单线程的情况,如果像对象引用一样容易被改变,那么也很容易出错。(比如将字符串传入到方法中,方法里面对字符串进行了修改,如果可变的话,会导致这个引用对应的字符串都发生了修改,不管是方法内还是方法外)
问题2:string如何做到不变?
其实并不是完全不可变。
先说不可变的原因:final + private修饰的字符数组。
可变的原因:字符数组是引用,可以通过反射获取到引用,并对他进行修改。
扩展:
integer等其他的基本数据类型也是不可变的。
好处:安全性。(同string,类似)