热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

String、StringBuffer和StringBuilder之间的区别

关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下1.三者在执行速度方面

关于这三个类在字符串处理中的位置不言而喻,那么他们到底有什么优缺点,到底什么时候该用谁呢?下面我们从以下几点说明一下

  1.三者在执行速度方面的比较:StringBuilder >  StringBuffer  >  String

  2.String <&#xff08;StringBuffer&#xff0c;StringBuilder&#xff09;的原因

    String&#xff1a;字符串常量

    StringBuffer&#xff1a;字符串变量

    StringBuilder&#xff1a;字符串变量

    从上面的名字可以看到&#xff0c;String是“字符串常量”&#xff0c;也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问  &#xff0c;比如这段代码&#xff1a;

String s &#61; "abcd";s &#61; s&#43;1;System.out.print(s);// result : abcd1

我们明明就是改变了String型的变量s的&#xff0c;为什么说是没有改变呢? 其实这是一种欺骗&#xff0c;JVM是这样解析这段代码的&#xff1a;首先创建对象s&#xff0c;赋予一个abcd&#xff0c;然后再创建一个新的对象s用来    执行第二行代码&#xff0c;也就是说我们之前对象s并没有变化&#xff0c;所以我们说String类型是不可改变的对象了&#xff0c;由于这种机制&#xff0c;每当用String操作字符串时&#xff0c;实际上是在不断的创建新的对象&#xff0c;而原来的对象就会变为垃圾被&#xff27;&#xff23;回收掉&#xff0c;可想而知这样执行效率会有多底。

     而StringBuffer与StringBuilder就不一样了&#xff0c;他们是字符串变量&#xff0c;是可改变的对象&#xff0c;每当我们用它们对字符串做操作时&#xff0c;实际上是在一个对象上操作的&#xff0c;这样就不会像String一样创建一些而外的对象进行操作了&#xff0c;当然速度就快了。

  3.一个特殊的例子&#xff1a;

String str &#61; “This is only a” &#43; “ simple” &#43; “ test”;StringBuffer builder &#61; new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);

你会很惊讶的发现&#xff0c;生成str对象的速度简直太快了&#xff0c;而这个时候StringBuffer居然速度上根本一点都不占优势。其实这是JVM的一个把戏&#xff0c;实际上&#xff1a;  

 String str &#61; “This is only a” &#43; “ simple” &#43; “test”;

    其实就是&#xff1a;

String str &#61; “This is only a simple test”;

    所以不需要太多的时间了。但大家这里要注意的是&#xff0c;如果你的字符串是来自另外的String对象的话&#xff0c;速度就没那么快了&#xff0c;譬如&#xff1a;

String str2 &#61; “This is only a”;String str3 &#61; “ simple”;String str4 &#61; “ test”;String str1 &#61; str2 &#43;str3 &#43; str4;

    这时候JVM会规规矩矩的按照原来的方式去做。

  4.StringBuilder与 StringBuffer

    StringBuilder&#xff1a;线程非安全的

    StringBuffer&#xff1a;线程安全的

    当我们在字符串缓冲去被多个线程使用是&#xff0c;JVM不能保证StringBuilder的操作是安全的&#xff0c;虽然他的速度最快&#xff0c;但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作&#xff0c;所以大多数情况下是建议用StringBuilder而不用StringBuffer的&#xff0c;就是速度的原因。

 

           对于三者使用的总结&#xff1a; 1.如果要操作少量的数据用 &#61; String

                        2.单线程操作字符串缓冲区 下操作大量数据 &#61; StringBuilder

                        3.多线程操作字符串缓冲区 下操作大量数据 &#61; StringBuffer







推荐阅读
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了使用C++Builder实现获取USB优盘序列号的方法,包括相关的代码和说明。通过该方法,可以获取指定盘符的USB优盘序列号,并将其存放在缓冲中。该方法可以在Windows系统中有效地获取USB优盘序列号,并且适用于C++Builder开发环境。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
author-avatar
左胸花枯萎
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有