Java中字符串的学习(三)StringBuffer与StringBuilder - devtrees

devtrees 2021-08-07 原文


Java中字符串的学习(三)StringBuffer与StringBuilder


StringBuffer

Buffer的意思是缓冲,缓冲区。

它与String的区别是

String一旦被创建,不能被改变。

而StringBuffer可以对字符串进行修改。

StringBuffer是一个容器。特点:

1长度可变。(数组长度不可变)

2可以操作多个数据类型。(数组只能操作一种类型)

3最终会通过toString方法变成字符串。

什么时候用?

当数据类型或个数不确定,而且最重要变成字符串的时候,

容器是可以放数据的。那这个容器应该具备什么功能呢?

这里先说明一下,字符串缓冲区,终究是跟字符串打交道,所以,我们向里面添加许多不同类型的数据,最后都要转换成字符串进行处理。

 

而容器的特点就是对数据的改变:CURD。

1.存储(增)C  create

Java.lang包下有StringBuffer类,也是final修饰,不能去继承。

它除了一堆的构造函数之外,还有一堆append()方法。这就是添加方法,而添加的数据包括基本数据类型。但是有两种基本数据类型没有:byte和short。为什么没有呢?因为这个添加的方法可以添加int类型参数,而byte和short是可以类型提升的。

StringBuffer append():将指定的数据作为参数添加到已有数据的结尾处。

那么在这里我们就写个小demo

 1 Class StringBufferDemo
 2 
 3 {
 4 
 5          Public static void main(String[] args)
 6 
 7          {
 8 
 9                    //既然是对其进行操作,就先创建一个缓冲区对象
10 
11 //当然创建的时候,根据api构造方法,我们是可以向里面传入字符串。
12 
13 //也可以是空
14 
15          StringBuffer sb = new StringBuffer();
16 
17 //那么接下来就是添加数据
18 
19 //返回类型还是StringBuffer
20 
21 StringBuffer s1 = sb.append(34);
22 
23 //这里把缓冲区变成字符串并打印(sb是对象,继承自父类Object,用父类的//toString()方法)
24 
25 Sop(sb.toString());
26 
27 Sop(sb1.toString());
28 
29 }
30 
31 Public static void sop(String str)
32          {
33 
34          System.out.println(str);
35 
36 }
37 
38 }

 

输出结果为:

34

34

可能有的朋友会问sb里面不应该什么也没有吗,sb1不应该添加完东西返回一个新的吗?

这里在打印个东西,大家就明白了

System.out.println(sb==sb1);

结果为:true.

这也就验证了:sb和sb1是同一对象。

缓冲区这里有个理论叫面盆理论。

在一个盆里放点面,加点水,和一和,揉一揉。这个盆就是StringBuffer,添了面(加了东西),还是这个盆,加了水(又加了其他东西),还是这个盆,还是StringBuffer。揉成面团了,还是这个盆,面团上加两个枣,还是这个盆,把枣去掉,还是这个盆,把面团扔了,还是这个盆。

所以,上面那段代码是麻烦的写法,简单可以如下:

Sp.append(“abd”).append(true).append(34);

这样的写法叫做方法调用链。

这样,打印出来的结果也是一段字符串:

Abdtrue34

当然,上述append()方法只能在原有基础上的结尾添加,不够灵活。

还有个insert()方法他就可以灵活的添加(添加到头、尾、中间),也有很多重载方法

StringBuffer insert(index, 数据):可以将数据插入到指定index位置。注意如果没有该脚标位置,报脚标位越界异常。

例如,我想在abdtrue34这个字符串中的a后添加内容,代码就是这样的:

Sb.insert(1,”qq”);

输出打印结果:

aqqbdtrue34

2.删除(删)D  delete

StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end.

StringBuffer deleteCharAt(index):删除缓冲区中指定位置的字符。

这里就不做实例了。但需注意:

做清空缓冲区的操作,应该是sb.delete(0,sb.length());而不是重新new StringBuffer();(这样是在内存中重新开辟内存空间创建缓冲区,耗费内存)

3.获取(查) R  read

Char charAt(int index):通过脚标获取字符

Int indexOf(String str):根据字符串获取相应位置。

IntlastIndexOf(String str): 根据字符串获取最后一次出现的相应位置

Int length():获取字符串的长度

String substring(int start):

String substring(int start,int end):

4.修改(改)U  update(替换)

把原来字符串中数据改变,不是添加。

StringBuffer replace(int start,int end,String str):头,尾,所替换的内容,注意被替换的和所替换的长度可以不相同。

Void setCharAt(int index,char ch):替换单个字符,替换完后就完事,不反悔任何数据。

5.反转

StringBuffer Reverse();

以上这些方法要熟记。

6.将缓冲区中的指定数据存储到指定字符数组中。

Void getChars(int srcBegin,intsrcEnd,char[] dst, int dstBegin)

遵循包含头不包含尾,如果所取的字符不够数组长度,多余脚标的用空字符占位。如果开始的脚标位到数组末尾的长度小于所取得的字符串的长度,出现脚标越界异常。

 

StringBuilder

它是一个可变的字符序列。提供了一个与StringBuffer兼容的API,(即功能一样)但不能够同步。该类被设计用作StringBuffer的一个简易替换。

而StringBuffer是一个线程安全的可变字符序列。

JDK1.5才出现StringBuilder

StringBuilder与StringBuffer的区别在于:

StringBuffer是线程同步的;

StringBuilder是线程不同步的。

先说一下线程的问题,一个容器,我们在向里面存储数据时,另外一个线程在做其他操作,比如修改或删除,那么数据在取得时候就会错乱。(并发执行产生错乱。)

那么当一个线程对数据进行操作时,其他线程则不能对数据进行操作,这是同步。StringBuffer就是这样的。是安全的,在添加的时候,是不能有其他操作的。多线程情况也不会。StringBuilder是不安全的。

那为什么选择SringBuilder呢?

如果是单线程程序,StringBuffer效率低,因为它要判断锁。而SringBuilder不需要锁,更快捷。

将StringBuilder的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用StringBuffer.

Java的升级无外乎三个方面:1,提高效率

2,简化书写

3,提高安全性。

而StringBuilder在1.5中出现正是为了提高效率。

以后开发,建议使用StringBuilder.

发表于
2015-03-27 08:39 
devtrees 
阅读(1057
评论(0
编辑 
收藏 
举报

 

版权声明:本文为devtrees原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/devtrees/p/4370791.html

Java中字符串的学习(三)StringBuffer与StringBuilder - devtrees的更多相关文章

  1. 微信小程序的ajax数据请求wx.request – 浙江百牛信息技术

    微信小程序的ajax数据请求wx.request 微信小程序的ajax数据请求,很多同学找不到api在哪个位置 […]...

  2. 硬盘GPT分区与MBR分区的转换 – wgwyanfs

    硬盘GPT分区与MBR分区的转换 怎样将gpt分区更改成mbr分区? ”由于笔记本电脑硬盘分区表是GPT而导致 […]...

  3. AutoCAD中套合矢量图和高清卫星地图教程 – bigemap4

    AutoCAD中套合矢量图和高清卫星地图教程   BIGEMAP无偏移影像叠加配准(Auto CAD版) 第一 […]...

  4. java web目录结构 – 是知也

    java web目录结构 转自:http://blog.csdn.net/javaloveiphone/art […]...

  5. CCF认证历年试题解【网上跟帖,请不要使用称呼】 – 海岛Blog

    CCF认证历年试题解【网上跟帖,请不要使用称呼】 程序改变现实,软件统治世界。 程序员需要有精益求精的工匠精神 […]...

  6. 学堂在线视频字幕抓取1_分析数据接口 – 轩_雨

    写在最前:互联网并非法外之地,爬虫仅供技术交流 运行环境 python 3.7.4 requests 2.10 […]...

  7. 360发布安全桌面 整合应用开放平台(图) – 天天编程

    360发布安全桌面 整合应用开放平台(图) 360安全桌面界面 如果用户的电脑上未安装360安全卫士,则不能成 […]...

  8. 谈服务可用性监控 – 轩脉刃

    谈服务可用性监控 2020-12-24 10:00  轩脉刃  阅读(1168)  评论(0)  编辑  收藏 […]...

随机推荐

  1. 吴恩达深度学习笔记 course4 week 4 特殊应用:人脸识别与神经风格转换

     1.What is face recognition? 人脸验证: input:图片,名字/ID outpu […]...

  2. Hibernate框架之入门案例

       今天终于开始学习了三大框架的其中一个框架,Hibernate框架,在这里不去讲Hibernate框架的一 […]...

  3. 涨知识:equals 和 == 你真的了解吗?

    基本概念 ==是运算符,比较的是两个变量是否相等; equals()是Object方法,用于比较两个对象是否相 […]...

  4. Win10远程桌面提示你的凭据不工作的处理方法

    远程桌面功能十分强大, windows10系统 用户们可以在网络这端控制另一端的计算机,并且可以和使用自己电脑 […]...

  5. 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)

    瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式。即多行等宽元素排列,后面的元素依次添加到其后,等宽 […]...

  6. [转]软件开发规范—模块开发卷宗(GB8567——88)

    做软件开发是有那么一套国准可参照的,当然就是那些文档了,这里列出一下所有软件开发的规范文档: 操作手册 用户手 […]...

  7. eclipse中搭建webservice的客户端和服务端

    由于在工作中需求要用到webservice技术,进行数据交换。研究了一下webservice,网上资料很多,看 […]...

  8. Windows Server 2019 预览版介绍

    在Windows server 2012、Windows server 2016还未完全普及的情况下,昨天Wi […]...

展开目录

目录导航