最近在看面试题目,发现很多都说到了“String StringBuffer以及StringBuilder的区别”,但是我发现在解释的时候存在一个问题。
网上绝大多数在说区别的时候提到了String是常量,StringBuffer以及StringBuilder是变量,String初始化之后便不可改变,另外两个可以改变。并且StringBuffer是线程安全的,而StringBuilder不是线程安全的。这部分可以说说的非常精炼了。
但是,在结束String为什么不可改变时,都说是因为String被修饰成final而不可修改,这与我对final类理解的有出入,就去深入了解了一下。
众所周知,String作为Java的基本数据类型是很常见的,不仅仅String,像Boolean也是很基础的数据类型,同样是final修饰的,同时还有Integer等等。并且final类并没有规定任何是否可修改的权限,仅仅是不可重载而已。
于是去看了String的代码,结果第一眼就看到了原因:String内存储数据的是名为value的数组,该数组被声明为final,而且final的成员是不可修改的。好了,到此为止就发现了String真正不能被修改的原因不是因为他是一个final类,而是存储数据的数组是final。
至于为什么这些基础的数据类型都被声明成了final类呢?我们这么想,如果你重载了String,改了里面一些方法,并且你自己用的很爽,然后有一天你找到一个包,需要用到包里面的功能,需要传入一个String类型的参数,然后你把你定义的String传进去。由于Java的继承关系是允许传子引用的,然后你发现结果和包说明的不一样,因为你不知道包内调用了什么方法,很可能就调用了你重载的方法,那结果自然和原来是String的是不一样的。这也体现了Java的“不可改变”的原则,这些很基础的东西就应该是不可改变的,维护Java生态的干净和统一。
全部评论