【Java】疯狂Java基础(四)——String, StringBuffer,StringBuilder的区别

发布时间:2023-05-10 17:17:11

  java中String、StringBuffer、Stringbuilder是编程中经常使用的字符串,它们之间的区别也是面试中经常问的问题。现在总结一下,看看它们的区别。

  1.可变和不可变

  在String类中使用字符数组来保存字符串,如下所示final“修饰符,所以可以知道string对象是不可变的。private final char value[]; String 对于不可改变的对象,一旦创建,其值就无法修改. . 现有String对象的修改是重新创建新对象,然后保存新值.

  Stringbuilder和Stringbuilder都是从Abstractstringbuilder继承的,在Abstractstringbuilder中也使用字符数组来保存字符串,如下所示,这两个对象都是可变的。

  char[] value; StringBuffer:它是一个可变对象,当它被修改时,它不会像String那样重建对象 , 它只能通过构造函数建立, 如: StringBuffer sb = new StringBuffer();

  不能通过赋值符号支付给他. , 如 sb = “welcome to here!”;//error 对象建立后,内存空间将在内存中分配,并初始保存nulll.赋值Stringbuffer时,可以使用其append方法. sb.append(“hello”);

  2.多线程是否安全

  String中的对象是不可变的,可以理解为常量, 显然,线程是安全的 。

  Abstractstringbuilder是stringbuilder和stringbuffer的公共父亲,定义了一些字符串的基本操作,如expandcapacity、append、insert、indexof等公共方法。

  Stringbuffer在调用方法中添加同步锁或同步锁,因此 线程安全的 。查看以下源码: public synchronized StringBuffer reverse() { super .reverse(); return this ; } public int indexOf(String str) { return indexOf(str, 0); //存在 public synchronized int indexOf(String str, int fromIndex) 方法 }

  Stringbuilder没有添加同步锁的方法,所以是 非线程安全 。

  3.Stringbuilder与Stringbuffer共同点

  Stringbuilder和Stringbuffer公共父类Abstractstringbuilder( 抽象类 )。

  抽象类和接口的区别之一是,一些子类的公共方法可以在抽象类中定义,子类只需要添加新的功能,而不需要重复现有的方法;接口只是方法的声明和常数的定义。

  StringBuilder、Stringbuffer的方法将在Abstractstringbuilder中调用公共方法,如super.append(..)。只有StringBuffer会在方法上添加synchronized关键字进行同步。

  最后,如果程序不是多线程的话,使用Stringbuilder比Stringbuffer更有效率。

  String效率比String更高 < StringBuffer < StringBuilder,但是在String S1 =“This is only a”+“simple”+“testString效率最高。

ps 图灵课堂老师从近一百套最新一线互联网公司面试题中精选而出,涵盖Java架构面试 所有技术栈,包括JVM,Mysql,并发,Spring,Redis,MQ,Zookeeper,Netty, Dubbo,Spring Boot,Spring Cloud,数据结构与算法,设计模式等相关技术领域的大 厂面试题及详解。 详情咨询客服获取全套面经试题。

上一篇 【Java】实体字段太多,lombok报Error:java: java.lang.StackOverflowError错误
下一篇 【java】从内存层面理解,为什么 int i = 0; i = i++; i的结果为0

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: