Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2019-04-08:请简述一下String、StringBuffer和StringBuilder的区别? #22

Open
Moosphan opened this issue Apr 8, 2019 · 17 comments
Labels

Comments

@Moosphan
Copy link
Owner

Moosphan commented Apr 8, 2019

No description provided.

@Ssuiyingsen
Copy link

1.String 为字符串常量,StringBuffer与StringBuilder字符串变量,从而效率:3.String2.StringBuffer1.StringBuilder(一般情况下);
2.StringBuffer是线程安全的,而StringBuilder为非线程安全;
3.String 是不可变的对象, 每次对 String 类型进行改变的等同于生成了一个新的 String 对象,经常改变内容的字符串不建议使用 String;
4.对StringBuffer 类改变,每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用,经常改变内容的字符串建议使用 StringBuffer ;
5.StringBuffer 上的主要操作为 append 和 insert 方法。

@SHPDZY
Copy link

SHPDZY commented Apr 8, 2019

String 拼接字符串时每次都会创建新的对象,适合少量拼接使用,速度最慢
StringBuffer 线程安全,适合多线程使用,比String快
StringBuilder 线程不安全,适合单线程使用,速度最快

Copy link

String 常量,java里面8大数据类型之一,相关知识:常量池
StringBuffer 和 StringBuilder 的父类都是 AbstractStringBuilder ,和 String常量区别是 String 进行字符串操作会重复开辟变量("" 双引号定义的相同字符串有个常量池复用效果)对进行批量操作效率低,StringBuffer 和 StringBuilder 内部维护一个 char[] value; 操作都是对这个 char数组对象操作,最后toString 才会转成你想要的 String , StringBuffer 是线程安全,StringBuilder 不是线程安全,通常类名xxxxBuilder 是不含线程安全~

Copy link

有时候东西记得模糊就需要有技巧的猜了,Buffer 在编程语言中多是数据流的意思(同理的还有stream),做完比较细的 Buffer 基本都是数据安全的(基本数据怎么可能都不是线程安全),Builder 一般是建造者,名字比较明显不太可能是线程安全,外加同一个子类有了StringBuffer 是线程安全。

@HeXiaosa
Copy link

HeXiaosa commented Apr 8, 2019

String : 是描述一个字符串变量的类,这个对象的字符串是固定的,不可变的,描述一个新的字符串变量需要创建一个新的对象。
StringBuilder : 用于字符串拼接,String 是不可变的,StringBuilder 拼接字符串不需要创建新的对象,它改变的是内部成员变量的内容。
StringBuffer : 和 StringBuilder 的区别就在于是线程安全的,而 StringBuilder 是线程不安全的。

@StefanShan
Copy link

StefanShan commented Apr 8, 2019

String 为字符串常量,一旦创建不可以被修改,是线程安全的;String 类使用 final 修饰符,不可以被继承;String 的长度是不变的。适用于少量操作的字符串。
StringBuffer 为字符串变量,长度是可变的,线程安全。适用于多线程下在字符缓冲区进行大量字符串操作
StringBuilder 为字符串变量,长度是可变的,线程不安全。适用于单线程下在字符缓冲区进行大量字符串操作。
字符串操作在执行速度:StringBuilder > StringBuffer > String

@mosentest
Copy link

StefanShan 回答好全,错过了一天

@canyie
Copy link

canyie commented Apr 8, 2019

String不可变,StringBuilder/StringBuffer可变,StringBuilder非线程安全,StringBuffer线程安全。建议需要经常改变的字符串使用StringBuilder/StringBuffer。

@shangyifei666
Copy link

String不能进行字符串拼接
StringBuilder可以进行字符串拼接,线程不安全但是运行效率比较高
StringBuffer可以进行字符串拼接,线程安全但是运行效率比较低

@Moosphan Moosphan added the underway the daily question is solving now label Apr 9, 2019
@Alex-Cin
Copy link

Alex-Cin commented Apr 9, 2019

在 StringBuilder append 的时候, 可能会涉及扩容, 没错就是用的 java.lang.System#arraycopy;
你能讲一下arrayCopy的实现机制吗? 时间复杂度是多少呢? (当时我就泪奔...)
有兴趣的同学, 可以关注一下, ArrayList 也会遇到这个问题;

@Moosphan Moosphan added Java and removed underway the daily question is solving now labels Apr 11, 2019
@shiguiyou
Copy link

在 StringBuilder append 的时候, 可能会涉及扩容, 没错就是用的 java.lang.System#arraycopy;
你能讲一下arrayCopy的实现机制吗? 时间复杂度是多少呢? (当时我就泪奔...)
有兴趣的同学, 可以关注一下, ArrayList 也会遇到这个问题;

这个方法好像不是java了:

@FastNative
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

@Alex-Cin
Copy link

Alex-Cin commented May 1, 2019

面试官, 只是想问你, 可能他自己都不知道;
@shiguiyou

@imtianx
Copy link

imtianx commented May 15, 2019

  • String 是 Java 语言非常基础和重要的类,提供了构造和管理字符串的各种基本逻辑。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的。也由于它的不可变性,类似拼接、裁剪字符串等动作,都会产生新的 String 对象。由于字符串操作的普遍性,所以相关操作的效率往往对应用性能有明显影响。

  • StringBuffer 是为解决上面提到拼接产生太多中间对象的问题而提供的一个类,我们可以用 append 或者 add 方法,把字符串添加到已有序列的末尾或者指定位置。StringBuffer 本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,也就是StringBuilder

  • StringBuilderJava 1.5 中新增的,在能力上和 StringBuffer 没有本质区别,但是它去掉了线程安全的部分(synchronized),有效减小了开销,是绝大部分情况下进行字符串拼接的首选。

@suagger
Copy link

suagger commented Nov 4, 2019

String是不可变类,它是由final修饰的一个类,也不能被继承,是字符串常量
StringBuilder和StringBuffer都是字符变量,它们两个类的对象都可以被修改,并且不产生新的未使用的对象
StringBuilder相对于StringBuffer是线程不安全的,但是效率高

@chunlinchulv
Copy link

chunlinchulv commented Nov 4, 2019

String: 被final修饰,不可变,这导致需要延长字符串时需要开辟空间创建新的String(比如:String str = hello,想要给该字符串添加上world时,则会先开辟空间存储world,再开辟空间将两个字符串拼接,也就是说,一个简单的拼接工作,String需要开辟三块空间来完成)

StringBuffer: 可变类,线程安全,在多线程中需要对大量数据进行操作时使用,StringBuffer对象存在缓存容量,当字符串的长度不超过缓存容量时不会开辟新的缓存容量,当字符串超过长度超过缓存容量大小时,会自动增加容量。

StringBuilder: 可变类,可直接在原来的基础上拼接(append),不会开辟新的空间来存储,速度更快,线程不安全,单线程操作字符串使用
all in all: 推荐使用StringBuilder(更快),在有安全需求时使用StringBuffer

@houqingfeng
Copy link

  1. String 字符串常量存储,线程不安全,做拼接处理的时候,会创建多个新对象,导致效率低下
  2. StringBuffer 字符串存储,线程安全,内部方法都用synchronized修饰,增加字符时候,空间容量以2倍方式扩展,做字符串操作的时候,是在char数组当中操作,不会创建新的字符串常量
  3. StringBuilder 与StingBuffer 一样都是继承自同一个父类AbstractStringBuilde,操作基本一样,只是没有synchronized修饰,对单线程string对象操作和StingBuffer 基本一样,那么问题来了,为啥要用StringBuilder?StringBuffer完全可以适用多数情况

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

16 participants