上一篇中讲解了String类的用法。那么String有什么特点呢?

字符串特点:字符串是常量,其值在创建后就不能被修改。字符串的内容一旦发生变化,就会创建一个新的对象。

代码验证字符串特点:

 public class Demo1 {

     public static void main(String[] args) {
String str1 = "hello";
String str2 = str1+" world";
System.out.println("str1与str2是同一个 对象吗?"+(str1==str2));
}
}

因此,字符串的内容不适宜频繁修改,为了解决此问题就出现了StringBuffer类和StringBuilder类。

StringBuffer

StringBuffer 其实就是一个存储字符的容器。StringBuffer 底层是依赖了一个字符数组才能存储字符数据 的,该字符串数组默认 的初始容量是16, 如果字符数组的长度不够使用 时,自动增长1倍+2。

容器具备的行为:增删改查。

具体的方法可以参照api。

1、增加(存储)

   StringBuffer append():将指定的数据作为参数添加到已有数据结尾处(除了byte和short类型的数据没有以外其他数据类型都有都可以)

   StringBuffer insert(index,数据):可以将数据插入到指定index位置

代码示例如下: 

 public static void stringBuffer_add(){
StringBuffer sb = new StringBuffer();
sb.append("abc").append(true).append(5378);//方法调用链结果是一串字符串
StringBuffer sb1 = sb.append(34563);
//结果是true sb和sb1指向同一个对象,这叫做面盆理论,不管往StringBuffer这个容器里加什么结果还是这个容器
System.out.println("sb==sb1:"+(sb==sb1));
//指定位置添加元素
StringBuffer sb2=sb1.insert(3,"hello");
System.out.println(sb2.toString());
}

2、删除

   StringBuffer delete(start,end)     删除缓冲区中的数据,包含start,不包含end,如果start超过角标的话,会抛出异常字符串角标越界
  StringBuffer deleteCharAt(index)   删除指定位置的字符 

代码示例如下: 

 public static void stringBuffer_del(){
StringBuffer sb = new StringBuffer("haohaoxuexi,tiantianxiangshang");
System.out.println(sb.toString()); //删除某一部分
sb.delete(1,3);
System.out.println(sb.toString()); //删除字符串中的某一个元素
sb.delete(2,3);
sb.deleteCharAt(2);
System.out.println(sb.toString());
//清空缓冲区
sb.delete(0,sb.length());
System.out.println(sb.toString());
}

3、修改

  StringBuffer replace(start,end,string); 替换指定位置的字符串
  void setCharAt(int index,char ch); 只可以替换某一个字符

代码示例:

 public static void stringBuffer_Update(){
StringBuffer sb1 = new StringBuffer("javascript");
StringBuffer sb2 = sb1.replace(4,10,"ee");
System.out.println(sb2);
sb1.setCharAt(1,'j');
System.out.println(sb1);
}

4、查看

  char charAt(int index) 获取指定索引的字符
  int indexOf(String str) 查找第一次出现字符串的索引
  int lastIndexOf(String str) 查找最后一次出现字符串的索引
  int length() 返回StringBuffer的长度
  String substring(int start , int end) 截取StringBuffer

代码示例:

 public static void stringBuffer_read(){
StringBuffer sb = new StringBuffer("javascript");
char ch = sb.charAt(3);
int index1 = sb.indexOf("sc");
int index2 = sb.lastIndexOf("sc");
int len = sb.length();
String str = sb.substring(5,7);
System.out.println("ch="+ch+",index1="+index1+",index2="+index2+",len="+len+",str="+str);
}

5、其他方法

  StringBuffer reverse(); 反转

  setLength();设置StringBuffer容器的长度  

  void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin);将缓冲区中指定数据存储到指定字符数组中

代码示例:

 public static void stringBuffer_Other() {
StringBuffer sb = new StringBuffer();
//设置长度
sb.setLength(4);
System.out.println(sb.length()); //将字符串反转
StringBuffer sb1 = new StringBuffer("java");
sb1 = sb1.reverse();
System.out.println(sb1);
// 将缓冲区中指定数据存储到指定字符数组中
char[] arr = new char[15];
StringBuffer sb2 = new StringBuffer("haohaoxuexi");
sb2.getChars(0, 7, arr, 3);
for(char c : arr){
System.out.print(c);
}
}

StringBuilder

JDK1.5版本之后出现了StringBuilder,StringBuilder几乎和StringBuffer中的方法完全一样。

StringBuffer和StringBuilder的相同和不同点:

相同点:

  1、两个类都是字符串缓冲类。

  2、两个类的方法都是一致的。

不同点:

  1、StringBuffer是线程安全的,操作效率低;StringBuilder是线程非安全的,操作效率高。

  2、StringBuffer是jdk1.0的时候出现的,StringBuilder是jdk1.5的时候出现的。

推荐使用:StringBuilder,因为其效率高。而且在现实开发中很少出现多线程情况下对同一字符串操作,所以这种操作可以忽略。

StringBuffer类 和 StringBuilder类的更多相关文章

  1. Java学习笔记20(String类应用、StringBuffer类、StringBuilder类)

    1.获取指定字符串中大小写和数字的个数: package demo; public class StringTest { public static void main(String[] args) ...

  2. Java基础-StringBuffer类与StringBuilder类简介

    Java基础-StringBuffer类与StringBuilder类简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.StringBuffer类 在学习过String类之后 ...

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

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

  4. StringBuffer类和StringBuilder类

    StringBuffer类和StringBuilder类 三者比较 String 不可变字符序列 底层用char[]存储 StringBuffer 可变的字符序列 线程安全的 效率低 底层结构使用ch ...

  5. string类和stringBuilder类

    字符串是C#中的一种重要数据类型,在项目开发中,离不开字符串操作.C#提供了string类实现字符串操作.于Convert类相似,string类中方法有静态方法和非静态方法.注意,在C#中String ...

  6. java中String类、StringBuilder类和StringBuffer类详解

    本位转载自http://www.cnblogs.com/dolphin0520/p/3778589.html  版权声明如下: 作者:海子 出处:http://www.cnblogs.com/dolp ...

  7. String类、StringBuilder类、StringBuffer类

    String类是不可变类,创建了一个String对象后,该String对象中的字符序列不能被改变. StringBuilder是字符序列可变的字符串类,提供了一系列修改字符串的方法. StringBu ...

  8. java常用类与包装类--常用类字符串String类、StringBuffer类、Stringbuilder类

    1.String类 1.1String类的概念和储存结构: (1)字符串是一个比较特殊的对象,可以使用new,也可以不使用new来创建字符串对象 String s1 = new String(&quo ...

  9. StringBuffer类、StringBuilder类详解

    StringBuffer是一个字符串缓冲区,是一个容器,而且长度可变,可以直接操作多个数据类型, 最终会通过toString()方法变成字符串. 容器的功能有: 1.存储 public StringB ...

随机推荐

  1. 往UISegmentedControl上添加几个控制器

    #import "RootViewController.h" #import "LoginViewController.h" #import "Reg ...

  2. UITableView删除添加和移动

    #import "RootTableViewController.h" @interface RootTableViewController () @property (nonat ...

  3. 【原】ios下比较完美的单例模式,已验证

    网上关于ios单例模式实现的帖子已经很多了,有很多版本,里面有对的也有不对的.我在使用过程中很难找到一个比较完美的方法,索性自己写一个吧,经过项目验证是比较合理的一个版本. static PRAuto ...

  4. iOS之UI--辉光动画

    前言:学习来自YouXianMing老师的博客:<辉光UIView的category>以及YouXianMing老师的github源码:< GlowView >    而我个人 ...

  5. iOS设计模式 - 单例

    备注:只能通过类的类方法才能创建单例类的实例,[[类名 alloc]init]创建实例没有用的. 原理图 说明 1. 单例模式人人用过,严格的单例模式很少有人用过 2. 严格的单例模式指的是无法通过常 ...

  6. php操作memcache的使用【转】

    1.简介 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力.它可以应对任意多个连接, ...

  7. Visual Studio发布Web项目报错:Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The specified file could not be encrypted.

    背景 Visual Studio下的Web项目 现象 发布时遇到Unable to add 'xxx' to the Web site.  Unable to add file 'xxx'. The ...

  8. Ubuntu 环境 运行Asp.net mvc +EntityFramework+ Mysql

    关键词:ubuntu,mono,.Net framework 4.5,asp.net mvc 4,Entityframework 6,Mysql Mono安装 参考文章: Install Mono o ...

  9. Node.js的模块载入方式与机制

    Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的API给开发者,并且它们在Node进程开始 ...

  10. 记一次Web应用CPU偏高

    LZ开发的一个公司内部应用供查询HIVE数据使用.部署上线后总是会出现CPU偏高的情况,而且本地测试很难重现.之前出现几次都是通过直接重启后继续使用,因为是内部使用,重启一下也没有很大影响(当然,每次 ...