当前位置: 首页 > news >正文

StringBuilder与StringBuffer

转:http://www.cnblogs.com/pepcod/archive/2013/02/16/2913557.html

JAVA中用于处理字符串常用的有三个类:

java.lang.String、

java.lang.StringBuffer、

java.lang.StringBuilder,

这三者的共同之处都是 final 类,不允许被继承,这主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着的,且考虑到防止其中的参数被修改影响到其它的应用。

StringBuffer 与 StringBuilder 两个基本上差不多,只是 StringBuffer 是线程安全,可以不需要额外的同步用于多线程中;

StringBuilder 是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比 StringBuffer 快多了;二者之间的共同点都可以通过append、insert进行字符串的操作。

String 实现了三个接口:Serializable、Comparable<String>、CharSequence,

而 StringBuffer 及 StringBuilder 只实现了两个接口 Serializable、CharSequence,相比之下 String 的实例可以通过 compareTo 方法进行比较,而其它两个就不可以。

以下是JDK中对String、StringBuffer、StringBuilder的详细介绍:

String:

String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:

     String str = "abc";

 等效于:

     char data[] = {'a', 'b', 'c'};

     String str = new String(data);

 下面给出了一些如何使用字符串的更多示例:

     System.out.println("abc");

     String cde = "cde";

     System.out.println("abc" + cde);

     String c = "abc".substring(2,3);

     String d = cde.substring(1, 2);

 String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。大小写映射基于 Character 类指定的 Unicode标准版。

Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的,该方法由 Object 类定义,并可被 Java 中的所有类继承。有关字符串串联和转换的更多信息,请参阅 Gosling、Joy 和 Steele 合著的 The Java Language Specification。

除非另行说明,否则将 null 参数传递给此类中的构造方法或方法将抛出 NullPointerException

String 表示一个 UTF-16 格式的字符串,其中的增补字符 由代理项对 表示(有关详细信息,请参阅 Character 类中的 Unicode 字符表示形式)。索引值是指 char 代码单元,因此增补字符在 String 中占用两个位置。

String 类提供处理 Unicode 代码点(即字符)和 Unicode 代码单元(即 char 值)的方法。

StringBuffer:

线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。

例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。

通常,如果 sb 引用 StringBuilder 的一个实例,则 sb.append(x) 和 sb.insert(sb.length(), x) 具有相同的效果。

只要发生有关源序列(如在源序列中添加或插入)的操作,该类就只在执行此操作的字符串缓冲区上而不是在源上实现同步。

每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5 开始,为该类补充了一个单个线程使用的等价类,即 StringBuilder。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。

StringBuilder:

一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。

转载于:https://www.cnblogs.com/1995hxt/p/5348632.html

相关文章:

  • 欧拉赞词
  • 或许是 Nginx 上配置 HTTP2 最实在的教程了
  • django之创建第7-6-第三种传值方式
  • MySQL之数据类型与操作数据表
  • setTimeOut
  • 关于 古人劝学 --写的真心是好 真的有收获
  • [CSS3备忘] transform animation 等
  • codeforces 660C C. Hard Process(二分)
  • 广搜最短路(最短时间到达目的地),POJ(3669)
  • 06章 初始继承和多态
  • Paragon NTFS for Mac® Yosemite - 免费下载
  • 全栈工程师的未来发展如何?
  • Linux内核分析8
  • CentOS 7.x设置自定义开机启动,添加自定义系统服务
  • linux中萌翻了的cowsay命令
  • golang中接口赋值与方法集
  • gulp 教程
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MQ框架的比较
  • opencv python Meanshift 和 Camshift
  • passportjs 源码分析
  • PV统计优化设计
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 分布式任务队列Celery
  • 计算机常识 - 收藏集 - 掘金
  • 那些年我们用过的显示性能指标
  • 少走弯路,给Java 1~5 年程序员的建议
  • 试着探索高并发下的系统架构面貌
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 数据科学 第 3 章 11 字符串处理
  • 通信类
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 小而合理的前端理论:rscss和rsjs
  • 2017年360最后一道编程题
  • ​低代码平台的核心价值与优势
  • # C++之functional库用法整理
  • #ifdef 的技巧用法
  • #Lua:Lua调用C++生成的DLL库
  • #pragma 指令
  • #QT(串口助手-界面)
  • (SpringBoot)第七章:SpringBoot日志文件
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (一)Linux+Windows下安装ffmpeg
  • (转)ABI是什么
  • (转)jQuery 基础
  • .FileZilla的使用和主动模式被动模式介绍
  • .libPaths()设置包加载目录
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net连接MySQL的方法
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • @Responsebody与@RequestBody