Java 中 String,StringBuffer 和 StringBuilder 的区别及用法
1简介
在Java语言中,共有8个基本的数据类型,分别为:byte、short、int、long、float、double、boolean和char,其中char类型用于表示单个字符,例如a、b、c、A、B、C、&这些大小写字母或者特殊字符等等。在实际的编程中,单个的字符并没有我们想象中用的那么频繁,反而是多个字符组成的“字符串”更为常见,但是在基本的数据类型中,并没有字符串这种数据类型。为了解决这个问题,Java语言为我们提供了一个被final关键字修饰的类String,她就表示字符串类型,同时由于其被final修饰,这也表明咱们只能用这个类创建字符串以及调用其中的方法,却不能继承她。
虽然Java语言为我们提供了字符串类String,能让我们方便的使用字符串类型,姑且这么说,但是在不断的发展中,我们发现单纯的String类型,并不足以满足我们的需求啦!因此,在String类型的基础上,又衍生出了两个字符串构建器StringBuffer和StringBuilder。对于这三种类型,无论是在求职面试的过程中,还是在日后的实际工作中,都是需要我们经常面对的,因此了解她们之间的区别就显得尤为重要啦!
2String
通过阅读“1简介”,我们已经大致了解了String类型啦!说她是一个数据类型,但她并不是基本数据类型,而是一个被final修饰的、不可被继承的类,位于java.lang包。至于如何使用String类型,有两种方法,一是直接赋值,二是用new创建,具体示例如下:
//1、直接赋值 Stringstr1="维C果糖"; //2、用new运算符创建 Stringstr2=newString("维C果糖");
在常见的字符串操作中,判断两个字符串是否相等尤为常见,且常用的判别方式有两种,即用String类提供的方法equals和==运算符,在博文“Java语言中equals和==的区别”中,作者详述了两者的区别,有兴趣的童鞋可以参考参考。接下来,作者将介绍一些使用频率比较高的String类的API方法:
booleanendsWith(Stringsuffix) //*如果字符串以suffix结尾,则返回true,否则返回false*/ booleanequals(Objectother) /*如果字符串与other相等,则返回true,否则返回false*/ booleanequalsIgnoreCase(Stringother) /*如果字符串与other相等(忽略大小写),则返回true,否则返回false*/ intlength() /*返回字符串的长度*/ Stringreplace(CharSequenceoldString,CharSequencenewString) /*返回一个新字符串,这个字符串用newString字符串代替原始字符串中所以的oldString字符串,可以用String或者StringBuilder对象作为CharSequence参数*/ booleanstartsWith(Stringprefix) /*如果字符串以prefix开始,则返回true,否则返回false*/ Stringsubstring(intbeginIndex) Stringsubstring(intbeginIndex,intendIndex) /*返回一个新字符串,这个字符串包含原始字符串中从beginIndex到串尾或endIndex-1位置的所以代码单元*/ StringtoLowerCase() /*返回一个新字符串,这个字符串将原始字符串中的所以大写字母都改成了小写字母*/ StringtoUpperCase() /*返回一个新字符串,这个字符串将原始字符串中的所以小写字母都改成了大写字母*/ Stringtrim() /*返回一个新字符串,这个字符串将删除元字符串头部和尾部的空格*/
3StringBuffer
在我们了解了String类之后,我们会发现她有些缺陷,例如当我们创建了一个String类的对象之后,我们很难对她进行增、删、改的操作,为了解决这个弊端,Java语言就引入了StringBuffer类。StringBuffer和String类似,只是由于StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不用生成新的对象,所以在内存的使用上StringBuffer要优于String类。
在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。但是有一个非常显著的区别在于,StringBuffer对象每次修改都是修改对象本身,这点是其和String类的最大区别。
此外,StringBuffer是线程安全的,可用于多线程。而且StringBuffer对象的初始化与String对象的初始化不大一样,通常情况下,我们使用构造方法进行初始化,即:
//声明一个空的StringBuffer对象 StringBuffersb=newStringBuffer(); //声明并初始化StringBuffer对象 StringBuffersb=newStringBuffer("维C果糖"); //下面的赋值语句是错的,因为StringBuffer和String是不同的类型 StringBuffersb="维C果糖"; //下面的赋值语句也是错的,因为StringBuffer和String没有继承关系 StringBuffersb=(StringBuffer)"维C果糖"; //将StringBuffer对象转化为String对象 StringBuffersb=newStringBuffer("维C果糖"); Stringstr=sb.toString();
接下来,介绍一些StringBuffer常用的API方法:
StringBuffer() /*构造一个空的字符串构建器*/ intlength() /*返回构建器或缓冲器中的代码单元(字符)数量*/ StringBufferappend(Stringstr) /*追加一个字符串并返回一个this*/ StringBufferappend(Charc) /*追加一个字符并返回一个this*/ voidsetCharAt(inti,charc) /*将第i个代码单元设置为c*/ StringBufferreverse() /*将构建器的内容进行顺序的反转c*/ StringtoString() /*返回一个与构建器或缓冲器内容相同的字符串*/
4StringBuilder
在JDK5.0之后,Java语言又引入了StringBuilder类,这个类的前身是StringBuffer,其效率略微有些低,但允许采用多线程的方式执行添加或者删除字符的操作。如果所有的字符串在一个单线程中(通常都是这样)编辑,则应该用StringBuilder代替她,这两个类的API是完全相同的。因此,在本部分,作者就不再赘言啦!
5总结
通过以上的介绍,咱们已经详细的了解了String、StringBuffer和StringBuilder,也知道了她们三个都是用于操作字符串的类。接下来,作者大致总结一些三者的区别,以供参考:
- 对于操作效率而言,一般来说,StringBuilder>StringBuffer>String;
- 对于线程安全而言,StringBuffer是线程安全的,可用于多线程;而StringBuilder是非线程安全的,用于单线程;
- 对于频繁的字符串操作而言,无论是StringBuffer还是StringBuilder,都优于String。
此外,通过String创建的对象的是不可变的,而通过StringBuffer和StringBuilder创建的对象是可以变的,这里的变与不变,指的是字符串的内容和长度。如果为了应对面试,能够记住以上内容的话,我想足够答的perfect啦;但是如果在实际开发中,如何选择,则要具体情况具体分析啦!
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!