先说说我对String类得印象吧,这是一个字符串类,设计成了不可变对象,也就是类以及类内部属性都设置成final类或者私有的域,并且没有对外提供更改内部属性的方法以及拓展。他主要就是用来存储字符串,每次我们拼接一个字符串或者set,内部都会生成一个新的对象。
可以看一下他的源码: 每次我们对字符串对象去设置值或者拼接时,实际上,是value指向了新的字符串的引用地址。,值是存储在value数组里面的。
那么我们可以先来看一下,String是如何被设计成不可变对象的呢?
在深入的了解下,为什么String要被设计成不可变对象呢?
我发现String这个对象在java中使用是很多的,甚至说,基本上,不涉及性能考虑以及多线程情况,基本都是使用这个类,这也涉及到了数据库的大量的增删改查,每次增删改查都会检查这个String对象的HashCode,设计成不可变对象,这个code值可以保证不可变,从而保证唯一。
在jvm中,他是存放在常量池的,如果该对象运行改变,那么会导致很多不可细数的逻辑错误,因为我们都是复用该值得。
使用上得问题吧,一般就是如果涉及到大量得拼接修改得话,建议不要使用String去存储字符串,可以使用StringBuffer,并且这个类还能保证线程安全,但是执行速度有待提高,如果是在单线程情况下,又有大量得拼接等操作,可以使用StringBuilder,这个得使用场景和StringBuffer是一样的。
如果要该变String类的值呢?
反射,我们可以通过反射去得到该实例,设置他的可改变属性威true,去修改value的值。
网友评论