接上文:Java基础——数组应用之字符串String类

一、StringBuffer类

StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。

所以在实际使用时,如果经常需要对一个字符串进行修改,例如插入、删除等操作,使用StringBuffer要更加适合一些。

在StringBuffer类中存在很多和String类一样的方法,这些方法在功能上和String类中的功能是完全一样的。

但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。

另外由于StringBuffer是线程安全的,所以在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。

1、StringBuffer对象的初始化

StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。

例如:

StringBuffer s = new StringBuffer();

这样初始化出的StringBuffer对象是一个空的对象。

如果需要创建带有内容的StringBuffer对象,则可以使用:

StringBuffer s = new StringBuffer(“abc”);

这样初始化出的StringBuffer对象的内容就是字符串”abc”。

需要注意的是,StringBuffer和String属于不同的类型,也不能直接进行强制类型转换,下面的代码都是错误的:

StringBuffer s = “abc”;               //赋值类型不匹配

StringBuffer s = (StringBuffer)”abc”;    //不存在继承关系,无法进行强转

StringBuffer对象和String对象之间的互转的代码如下:

String s = “abc”;

StringBuffer sb1 = new StringBuffer(“123”);

StringBuffer sb2 = new StringBuffer(s);   //String转换为StringBuffer

String s1 = sb1.toString();              //StringBuffer转换为String

2、StringBuffer的常用方法

StringBuffer类中的方法主要偏重于对于字符串的变化,例如追加、插入和删除等,这个也是StringBuffer和String类的主要区别。

a、append方法

public StringBuffer append(boolean b)

该方法的作用是追加内容到当前StringBuffer对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer对象的内容也发生改变,例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.append(true);

则对象sb的值将变成”abctrue”。

使用该方法进行字符串的连接,将比String更加节约内容,例如应用于数据库SQL语句的连接,例如:

StringBuffer sb = new StringBuffer();

String user = “test”;

String pwd = “123”;

sb.append(“select * from userInfo where username=“)

.append(user)

.append(“ and pwd=”)

.append(pwd);

这样对象sb的值就是字符串“select * from userInfo where username=test and pwd=123”。

b、deleteCharAt方法

public StringBuffer deleteCharAt(int index)

该方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“Test”);

sb. deleteCharAt(1);

该代码的作用删除字符串对象sb中索引值为1的字符,也就是删除第二个字符,剩余的内容组成一个新的字符串。所以对象sb的值变为”Tst”。

还存在一个功能类似的delete方法:

public StringBuffer delete(int start,int end)

该方法的作用是删除指定区间以内的所有字符,包含start,不包含end索引值的区间。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb. delete (1,4);

该代码的作用是删除索引值1(包括)到索引值4(不包括)之间的所有字符,剩余的字符形成新的字符串。则对象sb的值是”TString”。

c、insert方法

public StringBuffer insert(int offset, boolean b)

该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“TestString”);

sb.insert(4,false);

该示例代码的作用是在对象sb的索引值4的位置插入false值,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。

d、reverse方法

public StringBuffer reverse()

该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.reverse();

经过反转以后,对象sb中的内容将变为”cba”。

e、setCharAt方法

public void setCharAt(int index, char ch)

该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:

StringBuffer sb = new StringBuffer(“abc”);

sb.setCharAt(1,’D’);

则对象sb的值将变成”aDc”。

f、trimToSize方法

public void trimToSize()

该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。

总之,在实际使用时,String和StringBuffer各有优势和不足,可以根据具体的使用环境,选择对应的类型进行使用。

StringBuffer概述

StringBuffer是 String缓冲区,它具有如下特点:

1、它是一个容器。可以存储任意类型的元素(数据)。

2、它是多线程安全的。

3、可变长度的。

4、可以对其中存入的内容和长度进行修改。

5、容器通常都会具备一些基本的方法,添加、删除、修改、获取。curd =>create update read delete

6、字符串缓冲区最终还是要转换成字符串数据给别人使用。

StringBuffer方法

增加:

StringBuffer append(value);

StringBuffer insert(index  , value);

append和insert方法的区别:

|--append方法只能在尾部追加。

|--insert方法可以在任意位置添加。

sb.append(“a”)..append(9).append(‘a’)   输出结果为:a9a

删除:

StringBuffer delete(start,end);//当end的值大于字符串最大角标,则end等于最大角标

StringBuffer deleteCharAt(index);//删除指定字符

修改:

StringBuffer replace(start,end,str)//替换指定长度的字符串

void setCharAt(index,shar) //替换指定位置的字符

获取:

indexOf//获取字符所在位置

length();//获取字符串长度

charAt();//获取指定角标的字符

substring(start);//获取从指定位置到结尾的字符串

substring(start,end);//获取从start—end-1角标的字符串

StringBuffer  setLength(0);清空缓冲区  setLength(index)设置缓冲区的长度。

sb.StringBuffer delete(0,sb.length()) 清空缓冲区

二、StringBuilder类

升级无外乎三件事:

1、提高效率

2、简化代码

3、提高安全

JDK1.5以后,出现了StringBuilder,就是为了提高效率

StringBuilder使用于单线程,可以提高效率。因为它不加锁,不具备多线程的安全性

StringBuilder里面有锁,单线程使用的时候每次都需要判断锁,效率不高。

三、String、StringBuffer、StringBuilder的区别

1. 可变与不可变

  String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。

    private final char value[];

  StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。

    char[] value;

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。


相关链接:

黑马程序员_java基础(StringBuffer与StringBuilder)

java中String、StringBuffer、StringBuilder的区别

整理下java中stringBuilder和stringBuffer两个类的区别

探秘Java中的String、StringBuilder以及StringBuffer

Java中关于String类型的10个问题

深入理解Java:String

Java中String类的方法及说明

Java基础——数组应用之StringBuilder类和StringBuffer类相关推荐

  1. php byte stringbuffer,重拾java基础(十三):String姐妹StringBuffer、StringBuilder总结

    重拾java基础(十三):String姐妹StringBuffer.StringBuilder总结 一.StringBuffer类概述buffer:缓冲 2. 字符串缓冲区,跟String非常相似,都 ...

  2. Java基础之String,StringBuilder,StringBuffer三者的区别

    Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...

  3. 【JAVA SE】第十章 String类、StringBuffer类和StringBuilder类

    第十章 String类.StringBuffer类和StringBuilder类 文章目录 第十章 String类.StringBuffer类和StringBuilder类 一.String类 1.创 ...

  4. Java基础数组编写酒店管理系统

    文章目录 Java基础数组编写酒店管理系统 需求说明: 实现代码: ①酒店类(Hotel.java) ②房间类(Room.java) ③酒店管理测试类(HotelMgtSystem.java) 测试结 ...

  5. Java基础---数组练习(最大值、最小值的索引)

    Java基础–数组练习 1.将一维数组的遍历,封装成方法public static void arrayBianli(int[] arr) {for(int i = 0;i<arr.length ...

  6. 一大波Java来袭(四)String类、StringBuilder类、StringBuffer类对照

    本文主要介绍String类.StringBuffer类.StringBuilder类的差别  : 一.概述 (一)String 字符串常量.可是它具有不可变性,就是一旦创建,对它进行的不论什么改动操作 ...

  7. Java基础之面向对象的概念 继承---组合----枚举类

    Java基础之面向对象的概念 继承---组合----枚举类 本章作为面向对象概念的最后一篇,但是作为一名java程序员在面向对象的这条路上还很长. 一.继承与组合简介 继承是实现类重用的重要手段,但是 ...

  8. Java基础篇——字符串处理(String,StringBuffer,StringBuild)

    提前说明本次的文章很长但是很有用,有耐心看完的必定不是凡人,必定会有很大的收获.本人在总结的过程中也收获了很多的知识,希望我们可以一起学习.写下这篇文章完全是抱着可以帮助到他人的态度. 虽然要写出很高 ...

  9. Java常用类库(Object类、String类、StringBuffer类、包装类、Math类、System类)详解

    常用类库 java.lang java.lang包下放置了Java开发中常用的类和接口,所以为简化该包下类的使用,java.lang包下的类在使用时不需要导入这些类 java.lang包下常用类有: ...

最新文章

  1. java 实现hashmap_Java集合(十)实现Map接口的HashMap
  2. c++ 重载 重写_Java | 深入理解方法调用的本质(含重载与重写区别)
  3. Java 字节和字符流的读写+Buffered
  4. Linux IO 测试工具 fio命令
  5. 缓存雪崩,缓存穿透解决方案
  6. dw向右滚动字幕HTML,DW滚动文字代码肿么添加?
  7. 离线地图瓦片下载工具
  8. 小程序 轮播图之自动适应宽高度
  9. 全国计算机三级网络技术题库南开,计算机三级网络技术上机部分(南开100题题库).doc...
  10. 计算机审计实验一计划阶段,审计实验1.ppt
  11. 黑马程序员-学习日志-文件的合并
  12. 关于Jenkins下载代码失败,“Error cloning remote repo ‘origin‘“
  13. 关于BFS和dijkstra(2019.04.20)
  14. [转]Maxima笔记
  15. Unity3D坦克大战游戏开发——学习笔记(中)
  16. Altium_Designer中英文技术词汇对照
  17. Python爬虫——下载音乐
  18. python手机编程输入法_用Python写一个拼音输入法
  19. html3D效果可以在手机打开吗,HTML手机怎么打开
  20. 使用WinSCP连接阿里云轻量服务器

热门文章

  1. 全局变量及其含义php,php Server:php超全局变量Server的含义与用法示例
  2. 7-71 爬动的蠕虫 (15 分)
  3. 女生学师范还是计算机,本人专业是计算机科学与技术师范类,女生,不知道是考研还是工作什么的,今年开学大三,希望大家提点意见...
  4. JAVA输出1 10与5相乘的结果_完美起航-用java数组展示计算机的多位数相乘
  5. HDU 6581 Vacation
  6. # 20180908 2018-2019-2 《密码与安全新技术专题》第9周作业
  7. C#窗体在任务栏对窗体放大或缩小
  8. [Java面经] 关于面试的二三事.
  9. Andorid学习笔记(ADT)-LogCat日志调试工具
  10. bzoj1334 [Baltic2008]Elect