面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别
1.String:
/** Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* Because String objects are immutable they can be shared.
* 字符串是不变的,他们的值在创造后不能改变。
* 字符串缓冲区支持可变字符串,因为字符串对象是不可变的,所以它们可以共享。
*
* @see StringBuffer
* @see StringBuilder
* @see Charset
* @since 1.0
*/
public final class String implements Serializable, Comparable<String>, CharSequence {
private static final long serialVersionUID = -6849794470754667710L;
private static final char REPLACEMENT_CHAR = (char) 0xfffd;
这个是经是用的也是最早接触的,但是它的一大优点就是生成一个字符串如果下一次再创建相同的,则直接指向常量区里已经生成过的那个。
其他的先不讲这个东西的优点就是省资源,至于String类的另一个特点就是它是final修饰的也就是说不可被继承的。(网上还说它是线程安全的这个我面试的时候是 没想到)。
2.StringBuffer:
public final class StringBuffer
extends AbstractStringBuilder
implements java.io.Serializable, Appendable, CharSequence
{
/**
* Constructs a string buffer with no characters in it and an
* initial capacity of 16 characters.
*/
public StringBuffer() {
super(16);
}
public synchronized StringBuffer append(int i) {
super.append(i);
return this;
}
public synchronized StringBuffer delete(int start, int end) {
super.delete(start, end);
return this;
}
}
synchronized这个的出现就直接知道这个小东西是线程的安全的了。(经常会问是不是线程安全的,看一下代码记得快)。 3.StringBuilder:
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, Appendable, CharSequence {
public StringBuilder() {
super(16);
}
public StringBuilder append(String str) {
super.append(str);
return this;
}
public StringBuilder delete(int start, int end) {
super.delete(start, end);
return this;
}
}
他可以看成是StringBuffer的无synchronized版,线程不安全。
4.三者之间的区别:
4.1:String VS StringBuffer
4.1.1 初始化:
4.1.1.1String的初始化:
String a = null;
String a="asd";
4.1.1.2 StringBuffer的初始化
StringBuffer a = null; //结果警告:Null pointer access: The variable result can only be null at this location
StringBuffer a = new StringBuffer();//通过,这个是创建了一个空对象
StringBuffer a = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象
4.1.2 效率方面
//String效率是远要比StringBuffer快的:
String S = “a” + “ s” + “ d”;
StringBuffer Sb = new StringBuilder(“a”).append(“s”).append(“ d”);
4.1.3 执行速度方面
//String速度是非常慢的:
String S1 = “a”;
String S2 = “ s”;
String S3 = “ d”;
String S4 = S1 +S2 + S3;
String对象不可变,重复新建对象需要花费很多时间;StringBuffer对象可变所以在插入删除方面有着很好的优势。
PS: 注意在开头的代码可以看出StringBuilder与StringBuffer的区别在于方法的同步关键字的添加与否,所以效率与执行速度String与StringBuilder的比较 是可以和上面String与StringBuffer比较做参照的。当然在初始化的方面同样可以。
4.1.4 总结
少量数据的操作为了追求效率可以用String;
大量数据的拼接,插入,删除则建议使用StringBuffer;
4.2 StringBuffer VS StringBuilder
4.2.1 线程安全
这是这块知识最容易记住的,从上面的代码中就可看出StringBuffer是线程安全的,而StringBuilder是非线程安全的。
4.2.2 执行速度
在不考虑线程安全的情况下(单线程),StringBuilder的执行速度是快于StringBuffer,而且在大量的数据(这里指String字符串)需要进行插入,删除, 拼接的是执行速度也是远快于String的。
5 总结
a.如果要操作少量的数据用 String;
b.多线程操作字符串缓冲区下操作大量数据 StringBuffer;
c.单线程操作字符串缓冲区下操作大量数据 StringBuilder。
面试长谈的String,StringBuffer,StringBuilder三兄弟有啥区别的更多相关文章
- String,StringBuffer,StringBuilder的区别及其源码分析
String,StringBuffer,StringBuilder的区别这个问题几乎是面试必问的题,这里做了一些总结: 1.先来分析一下这三个类之间的关系 乍一看它们都是用于处理字符串的java类,而 ...
- 关于String StringBuffer StringBuilder
0. String对象的创建 1.关于类对象的创建,很普通的一种方式就是利用构造器,String类也不例外:String s=new String("Hello world&qu ...
- [置顶] String StringBuffer StringBuilder的区别剖析
这是一道很常见的面试题目,至少我遇到过String/StringBuffer/StringBuilder的区别:String是不可变的对象(final)类型,每一次对String对象的更改均是生成一个 ...
- String StringBuffer StringBuilder (转)
转自:http://www.iteye.com/topic/522167 众所周知,String是由字符组成的串,在程序中使用频率很高.Java中的String是一个类,而并非基本数据类型. 不过她却 ...
- final,finally,finalize有什么区别?String, StringBuffer, StringBuilder有什么区别?Exception和Error有什么区别?
继上篇JVM学习之后,后面将分三期深入介绍剩余JAVA基础面试题,每期3题. 题目一.final,finally,finalize有什么区别? /*请尊重作者劳动成果,转载请标明原文链接:*/ /* ...
- 转:String StringBuffer StringBuilder区别
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...
- String&StringBuffer&StringBuilder区别
String String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式: (1)直接赋值(例中,String str = &q ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- String,StringBuffer,StringBuilder的区别
public static void main(String[] args) { String str = new String("hello...."); StringBuffe ...
随机推荐
- 2016年android程序员需要知道的新技术
2016你需要了解Android有以下新兴的技术与框架,有些也许还不成熟,但是你应该去了解下,也许就是未来的方向. Kotlin 作为 Android 领域的 Swift,绝对让你如沐新风.抛弃沉重的 ...
- 多线程实现之Java
关于Java线程的生命周期,请看下面这张图: 新建状态(New):当线程对象创建后,即进入了新建状态,如:Thread t = new MyThread(); 就绪状态(Runnable):当调用线程 ...
- SystemVerilog语言简介(三)
15. 强制类型转换 Verilog不能将一个值强制转换成不同的数据类型.SystemVerilog通过使用'操作符提供了数据类型的强制转换功能.这种强制转换可以转换成任意类型,包括用户定义的类型.例 ...
- R学习笔记(4): 使用外部数据
来源于:R学习笔记(4): 使用外部数据 博客:心内求法 鉴于内存的非持久性和容量限制,一个有效的数据处理工具必须能够使用外部数据:能够从外部获取大量的数据,也能够将处理结果保存.R中提供了一系列的函 ...
- jQuery提示parsererror错误解决办法
jquery来处理ajax,用到了json.但是很诧异,jquery的ajax回调时一直调用了error函数(一直提示parsererror异常),success函数一次没执行过 $.ajax({ t ...
- directX播放程序
enum PLAYSTATE {Stopped, Paused, Running, Init};PLAYSTATE g_Current=Init;HWND ghApp;HINSTANCE g ...
- 芝麻HTTP:
只要你的Scrapy Field字段名字和 数据库字段的名字 一样.那么恭喜你你就可以拷贝这段SQL拼接脚本.进行MySQL入库处理. 具体拼接代码如下: def process_item(self, ...
- Django学习-24-Ajax
jQuery.Ajax是原生Ajax的封装,它能自动识别浏览器的Ajax对象HttpResponse(status='404',reason='Page Not Found') 原生Ajax使用Xml ...
- freemarker中的left_pad和right_pad(十五)
freemarker中的left_pad和right_pad 1.简易说明 (1)left_pad 距左边 (2)right_pad 距右边 (3)当仅仅只有一个参数时,插入的是空白:当有两个参数时, ...
- linux iscsi配置
iSCSI 是一种 SAN的设备而 SAN的设备主要是提供 Server 存储体的空间.相较于传统的 SAN 是以光纤为传输媒体而 iSCSI(Internet SCSI)他是 IP-based 的数 ...