博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java学习——String变量中的双胞胎
阅读量:4262 次
发布时间:2019-05-26

本文共 2066 字,大约阅读时间需要 6 分钟。

      最近在做DRP的项目中学习了String对象的两个扩展对象,StringBuffer和StringBuilder,刚开始对他们不是很了解,查了一些资料才发现,原来他们都继承自AbstractStringBuilder类,也就是说他们是两个双胞胎,那么就让我们来了解一下这两个双胞胎。

一、StringBuffer

      在介绍StringBuffer之前,我们先说说String对象。String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

private final char value[];

      ava.lang.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

      java.lang.StringBuilder一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。

      在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串生成器中。

三、比较

1、共同点:

StringBuffer和StringBuilder 都继承相同的实现类【AbstractStringBuilder】
而且字符串append方法 都是调用AbstractStringBuilder的append方法,所以本身没有效率差别。
在AbstractStringBuilder中也是使用字符数组保存字符串,由此可知这两种对象都是可变的。
底层实现都是使用数组

2、不同点:

StringBuffer中的方法在底层实现的时候, 大多使用【synchronized】关键字,所以,StringBuffer是线程安全的。StringBuilder 中则没有,因此,StringBuilder不是线程安全的。
效率差别在于【synchronized】,实现加锁,解锁自然要浪费时间,所以StringBuilder效率高于StringBuffer

四、适用场景

1.使用String类的场景

      在字符串不经常变化的场景中可以使用String类,例如常量的声明、少量的变量运算。

2.使用StringBuffer类的场景

      在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer,例如XML解析、HTTP参数解析和封装。

3.使用StringBuilder类的场景

      在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用StringBuilder,如SQL语句的拼装、JSON封装等。

五、总结

      我们了解了StringBuffer和StringBuilder的区别就在于线程问题,当然,我们要根据我们的实际情况来选择适用的变量,这样我们才能既保证我们系统的安全性,又能提高系统的性能。

转载地址:http://iumei.baihongyu.com/

你可能感兴趣的文章
sublime Text3使用笔记
查看>>
使用webstom或者idea上传代码到github或coding
查看>>
YAML 语法
查看>>
AES加密
查看>>
使用Github进行合作开发
查看>>
Impala入门笔记(转载)
查看>>
cloudera Manager中监控数据的存储
查看>>
Kafka简要介绍
查看>>
Maven环境的搭建
查看>>
hbase 学习梳理
查看>>
浅谈医学大数据(中)
查看>>
阿里巴巴数据产品经理工作总结
查看>>
大数据的特点及作用
查看>>
IBM朱辉:大数据分析的5个高复制使用场景及案例分享(含PPT)
查看>>
Java返回对象快捷键
查看>>
STL中的Iterator
查看>>
C语言拾遗
查看>>
数据库查询语句拾遗
查看>>
STL中的Vector
查看>>
C++中的trivial、standard layout、POD
查看>>