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。对于这三种类型,无论是在求职面试的过程中,还是在日后的实际工作中,都是需要我们经常面对的,因此了解她们之间的区别就显得尤为重要啦!
2 string
通过阅读“1 简介”,我们已经大致了解了 string 类型啦!说她是一个数据类型,但她并不是基本数据类型,而是一个被 final 修饰的、不可被继承的类,位于 java.lang 包。至于如何使用 string 类型,有两种方法,一是直接赋值,二是用 new 创建,具体示例如下:
// 1、直接赋值 string str1 = "维c果糖"; // 2、用 new 运算符创建 string str2 = new string("维c果糖");
在常见的字符串操作中,判断两个字符串是否相等尤为常见,且常用的判别方式有两种,即用 string 类提供的方法 equals 和 == 运算符,在博文“java 语言中 equals 和 == 的区别”中,作者详述了两者的区别,有兴趣的童鞋可以参考参考。接下来,作者将介绍一些使用频率比较高的 string 类的 api 方法:
boolean endswith(string suffix) //* 如果字符串以 suffix 结尾,则返回 true,否则返回 false */ boolean equals(object other) /* 如果字符串与 other 相等,则返回 true,否则返回 false */ boolean equalsignorecase(string other) /* 如果字符串与 other 相等(忽略大小写),则返回 true,否则返回 false */ int length() /* 返回字符串的长度 */ string replace(charsequence oldstring, charsequence newstring) /* 返回一个新字符串,这个字符串用 newstring 字符串代替原始字符串中所以的 oldstring 字符串,可以用 string 或者 stringbuilder 对象作为 charsequence 参数 */ boolean startswith(string prefix) /* 如果字符串以 prefix 开始,则返回 true,否则返回 false */ string substring(int beginindex) string substring(int beginindex, int endindex) /* 返回一个新字符串,这个字符串包含原始字符串中从 beginindex 到串尾或 endindex-1 位置的所以代码单元 */ string tolowercase() /* 返回一个新字符串,这个字符串将原始字符串中的所以大写字母都改成了小写字母 */ string touppercase() /* 返回一个新字符串,这个字符串将原始字符串中的所以小写字母都改成了大写字母 */ string trim() /* 返回一个新字符串,这个字符串将删除元字符串头部和尾部的空格 */
3 stringbuffer
在我们了解了 string 类之后,我们会发现她有些缺陷,例如当我们创建了一个 string 类的对象之后,我们很难对她进行增、删、改的操作,为了解决这个弊端,java 语言就引入了 stringbuffer 类。stringbuffer 和 string 类似,只是由于 stringbuffer 的内部实现方式和 string 不同,stringbuffer 在进行字符串处理时,不用生成新的对象,所以在内存的使用上 stringbuffer 要优于 string 类。
在 stringbuffer 类中存在很多和 string 类一样的方法,这些方法在功能上和 string 类中的功能是完全一样的。但是有一个非常显著的区别在于,stringbuffer 对象每次修改都是修改对象本身,这点是其和 string 类的最大区别。
此外,stringbuffer 是线程安全的,可用于多线程。而且 stringbuffer 对象的初始化与 string 对象的初始化不大一样,通常情况下,我们使用构造方法进行初始化,即:
// 声明一个空的 stringbuffer 对象 stringbuffer sb = new stringbuffer(); // 声明并初始化 stringbuffer 对象 stringbuffer sb = new stringbuffer("维c果糖"); // 下面的赋值语句是错的,因为 stringbuffer 和 string 是不同的类型 stringbuffer sb = "维c果糖"; // 下面的赋值语句也是错的,因为 stringbuffer 和 string 没有继承关系 stringbuffer sb = (stringbuffer)"维c果糖"; // 将 stringbuffer 对象转化为 string 对象 stringbuffer sb = new stringbuffer("维c果糖"); string str = sb.tostring();
接下来,介绍一些 stringbuffer 常用的 api 方法:
stringbuffer() /* 构造一个空的字符串构建器 */ int length() /* 返回构建器或缓冲器中的代码单元(字符)数量 */ stringbuffer append(string str) /* 追加一个字符串并返回一个 this */ stringbuffer append(char c) /* 追加一个字符并返回一个 this */ void setcharat(int i, char c) /* 将第 i 个代码单元设置为 c */ stringbuffer reverse() /* 将构建器的内容进行顺序的反转 c */ string tostring() /* 返回一个与构建器或缓冲器内容相同的字符串 */
4 stringbuilder
在 jdk 5.0 之后,java 语言又引入了 stringbuilder 类,这个类的前身是 stringbuffer,其效率略微有些低,但允许采用多线程的方式执行添加或者删除字符的操作。如果所有的字符串在一个单线程中(通常都是这样)编辑,则应该用 stringbuilder 代替她,这两个类的 api 是完全相同的。因此,在本部分,作者就不再赘言啦!
5 总结
通过以上的介绍,咱们已经详细的了解了 string、stringbuffer 和 stringbuilder,也知道了她们三个都是用于操作字符串的类。接下来,作者大致总结一些三者的区别,以供参考:
- 对于操作效率而言,一般来说,stringbuilder > stringbuffer > string;
- 对于线程安全而言,stringbuffer 是线程安全的,可用于多线程;而 stringbuilder 是非线程安全的,用于单线程;
- 对于频繁的字符串操作而言,无论是 stringbuffer 还是 stringbuilder,都优于 string。
此外,通过 string 创建的对象的是不可变的,而通过 stringbuffer 和 stringbuilder 创建的对象是可以变的,这里的变与不变,指的是字符串的内容和长度。如果为了应对面试,能够记住以上内容的话,我想足够答的 perfect 啦;但是如果在实际开发中,如何选择,则要具体情况具体分析啦!
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
推荐阅读
-
Java 中 String,StringBuffer 和 StringBuilder 的区别及用法
-
Java中equals与==的用法和区别
-
Java中String、StringBuffer、StringBuilder的区别介绍
-
Java中StringBuffer和StringBuilder区别
-
Java 中 String,StringBuffer 和 StringBuilder 的区别及用法
-
Java中String、StringBuffer、StringBuilder的区别介绍
-
Java中的Vector和ArrayList区别及比较
-
Java中StringBuffer和StringBuilder区别
-
Java中的Vector和ArrayList区别及比较
-
java中 String和StringBuffer的区别实例详解