上一篇中讲解了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. JAVA基础学习day19--IO流一、FileWrite与FileReader

    一.IO简述 1.1.简述 IO:input/output IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的对象都在IO包中. 1.2.结构 字节流抽象类: ...

  2. IOS 杂笔- 6(KVC-KVO)

    kvc: 键值编码的基本概念 1:键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可以访问对象属性. 2:键值编码方法在Objective-C非正式协(类别)NSKe ...

  3. IOS开发--常用的基本GDB命令

    gdb不是万能的,可是没有gdb却是万万不能的.这里给大家简单介绍下iOS开发中最基本的gdb命令. po po是print-object的简写,可用来打印所有NSObject对象.使用举例如下: ( ...

  4. nodejs socket

    server.js var net = require('net'); var clientList = []; var HOST = '127.0.0.1'; var PORT = 6969; va ...

  5. App Icon生成工具(转载)

    原地址:http://www.cocoachina.com/bbs/read.php?tid=290247 下载软件:在AppStore搜索App Icon Gear 打开软件 决定制作启动图或图标, ...

  6. <极客学院>视频教程学习笔记-iOS中CALayer的使用

    <1>CALayer简介 1.CALayer一般作为UIView的容器而使用. 2.CALayer是一个管理者图片载体(image-based content)的层结构 3.直接修改单独创 ...

  7. 大家一起和snailren学java-(四)初始化与清理

    初始化和清理,是一个生命周期的起始.在java中,对象的初始化和对象的回收是怎样的呢? 在开发c++的时候,有构造器的概念.即对象的创建,首先默认调用构造器进行初始化.在java中也有“构造器”.ja ...

  8. jQuery 安装方法

    在WEB中使用jQuery有两种安装(引入)方式. 1.直接下载jQuery包放置到工程中,然后用js导入的方式连接到WEB页面中 2.利用CDN的公网资源,如百度.新浪等. 访问 http://cd ...

  9. 2013MPD上海6.22 PM 陆宏杰:通往卓越管理的阶梯 & 6.23AM Ray Zhang 产品创新管理的十八般武艺

    MPD2天的内容,参加了5个课程,其中2个是管理的,分别是陆宏杰老师的<通往卓越管理的阶梯>和Ray Zhang大师的<产品创新管理的十八般武艺>.他们2个人都谈到了一个关于招 ...

  10. 完全卸载VS2005或VS2008的步骤

    手动卸载步骤: Visual Studio Express Editions 进入控制面板,运行添加或删除程序  卸载 "MSDN Library for Visual Studio 200 ...