面试长谈的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 ...
随机推荐
- CSS3之background-clip
1.属性简介 background-clip:padding|border|content|text|!important 2.兼容性 (1)IE6.7.8不兼容 (2)火狐3.0以上兼容 (3)Ch ...
- 解析FAT16文件系统
引导扇区的信息如下: 1. 偏移地址00H,长度3,内容:EB 3C 90 跳转指令. 2. 偏移地址03H,长度8,内容:4D 53 44 4F 53 35 2E 30 为厂商标志和os 版本号 ...
- 关于tween.js测试介绍
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>t ...
- [mysql] 2进制安装和简单优化
##################################mysql 2进制安装和简单优化################################################## ...
- sqoop将mysql连表查询结果导入hdfs文件
sqoop import --connect jdbc:mysql://ip/数据库 --username 用户名 --password 密码 --query " select p.bidN ...
- Python Web-第六周-JSON and the REST Architecture(Using Python to Access Web Data)
1.JavaScript Object Notation JSON 1.JSON 官方介绍 http://www.json.org/json-zh.html 2.json1.py import jso ...
- Redis入门必读,The Little Redis Book中文版
csdn的博客都要搬到这里了 The Little Redis Book中文版 入门 The Little Redis Book中文版 第一章 - 基础知识 The Little Redis Book ...
- Java中使用UDP实现简单的聊天功能
通过DatagramSocket类来实现.此类表示用来发送和接收数据报包的套接字. 发送端代码如下: import java.io.IOException; import java.net.*; im ...
- FFT \ NTT总结(多项式的构造方法)
前言.FFT NTT 算法 网上有很多,这里不再赘述. 模板见我的代码库: FFT:戳我 NTT:戳我 正经向:FFT题目解题思路 \(FFT\)这个玩意不可能直接裸考的..... 其实一般\(FF ...
- 【Luogu2711】小行星(网络流,最大流)
[Luogu2711]小行星(网络流,最大流) 题面 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最 ...