String,StringBuffer和StringBuilder
-
String类
String是字符串常量,是不可变的对象,因此String消耗内存极大。举个例子:想要将两个字符串组合成一个,例如创建一个字符串String s=“hello"与另一个"world”,在这里字符串s和"world"各占一个空间内存,通过s+="world"这个运算后会得到s=“helloworld"的字符串,但是这个字符串是在内存中重新创建一个空间保存下来的,而不是在原有的基础上加上"world”,所以这里我们就用了3个存储空间(因为前面的两个字符串并没有被覆盖或删除,只是s指向了新的字符串),因此若是使用过程中需要修改字符串的,不建议使用String类定义,下面我会讲到StringBuffer和StringBuilder类,这两个可以很好的解决这个问题。 -
StringBuffer、StringBuilder类
StringBuffer和StringBuilder都是字符串变量,二者都是可变类,并且修改过程中不会指向和创建新的存储空间,但若是修改后的空间大于原有的空间,它们会自动扩容(类似于ArrayList的自动扩容)。主要区别在于前者是线程安全(可以被同步访问,相当于可以多人同时操作)后者是非线程安全(不能被同步访问),还有就是后者是Java5提出的,执行效率高,速度更快。总的来说,StringBuffer和StringBuilder的功能差不多,具体用哪个还得看需求,若是要求多人同时操作则必须使用StringBuffer。 -
总结
String类的最大弊端就是使用过程中会占用大量的内存,因此在后面的学习和使用中它的频率会比较低。而StringBuffer和StringBuilder很好的解决了这个问题,String和其它两个还有一个重要区别就是String可以赋值为null而StringBuffer和StringBuilder必须用new来初始化,不可以直接赋值。在后面我们还会学到多线程与单线程,多线程下我们就得使用StringBuffer,而StringBuilder则用于单线程,所以这两个字符串变量之后的使用频率会很高,也建议大家多使用,熟悉一下它们的用法。