·作为Java中最为基础的部分,在Java的学习过程中,就一定会学习到字符串,其中String类作为字符串。并且在Java所有的程序中是使用字符串都是使用String类去实现。

  两者存在一定的通性,都是可以储存和操作字符串,即包含多个字符的字符串数据。

  但是StringBuffer与Sting的区别在哪里?

  下面将讲述Sting与StringBuffer最为关键的区别之处在哪里?

  1、从字符串的内容是否可以被修改上

  String:字符串作为常量;则有一个这样的通性,它们的值在创建之后不能更改。在字符串的数组中,String对象是不可以改变的,这是因为存在这样的缺点也是具有一个与众不同的有点,编译器可以把字符串设立为共享。

  下面是String的表达式:

      String str = "abc";

    等效于:

      char data[] = {'a','b','c'};

      String str = new String(data);

  StringBuffer:StringBuffer类作为一个不同之处及优点在辅助类,可以在使用之前预先分配指定长度的内存块建立一个字符串缓冲区,这样的效益比String中需要每次都要开辟一个内存空间优于很多。StringBuffer是线程安全的,在多线程程序中也可以很方便去使用,但是相对于线程不安全的效率要稍低一点。

  2、从对象本身的改变上

  每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象。

  每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。

  而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的。如以下的例子:

   String S1 = “This is only a” + “ simple” + “ test”;
   StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
   你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
   String S1 = “This is only a” + “ simple” + “test”; 其实就是:
   String S1 = “This is only a simple test”; 所以当然不需要太多的时间了。

基于以上两点区别,在大部分情况下,StringBuffer > String

  下面介绍一下StringBuffer中经常使用到的几种方法:

  1、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”。
  
2、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”。
  3、insert方法
  public StringBuffer insert(int offset, String s)
  该方法的作用是在StringBuffer对象中插入内容,然后形成新的字符串。例如:
  StringBuffer sb = new StringBuffer(“TestString”);
  sb.insert(4,“false”);
  该示例代码的作用是在对象sb的索引值4的位置插入字符串false,形成新的字符串,则执行以后对象sb的值是”TestfalseString”。
  
4、reverse方法
  public StringBuffer reverse()
  该方法的作用是将StringBuffer对象中的内容反转,然后形成新的字符串。例如:
  StringBuffer sb = new StringBuffer(“abc”);
  sb.reverse();
  经过反转以后,对象sb中的内容将变为”cba”。
  5、setCharAt方法
  public void setCharAt(int index, char ch)
  该方法的作用是修改对象中索引值为index位置的字符为新的字符ch。例如:
  StringBuffer sb = new StringBuffer(“abc”);
  sb.setCharAt(1,’D’);
  则对象sb的值将变成”aDc”。
  
6、trimToSize方法
  public void trimToSize()
  该方法的作用是将StringBuffer对象的中存储空间缩小到和字符串长度一样的长度,减少空间的浪费。
  7、构造方法:
  StringBuffer s0=new StringBuffer();分配了长16字节的字符缓冲区
  StringBuffer s1=new StringBuffer(512);分配了512字节的字符缓冲区
  
8、获取字符串的长度: length()
  StringBuffer s = new StringBuffer("www");
  int i=s.length();
  m.返回字符串的一部分值
  substring(int start) //返回从start下标开始以后的字符串
  substring(int start,int end) //返回从start到 end-1字符串
  
9.替换字符串
  replace(int start,int end,String str)
  s.replace(0,1,"qqq");
  
10.转换为不变字符串:toString()。

 
 

分享:SringBuffer与String的区别的更多相关文章

  1. python中string.casefold和string.lower区别

    string.casefold和string.lower 区别 python 3.3 引入了string.casefold 方法,其效果和 string.lower 非常类似,都可以把字符串变成小写, ...

  2. C字符串和C++中string的区别 &&&&C++中int型与string型互相转换

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:   C字符串 string对象(C++) 所需的头文件名称 ...

  3. java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别

    public class StringBuilderTest { /** * StringBuffer和Stringbuilder :使用与内容可以被修改的字符串 * 与String的区别:Strin ...

  4. C字符串和C++中string的区别 &&&&C++中int型与string型互相转换

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:   C字符串 string对象(C++) 所需的头文件名称 ...

  5. JAVA中String = null 与 String = "" 的区别

    JAVA中String = null 与 String = ""的区别 笔者今天在Debug的时候发现的NPE(NullPointerException),辛辛苦苦地调试了半天,终 ...

  6. 好程序员技术分享html5和JavaScript的区别

    好程序员技术分享html5和JavaScript的区别,HTML5广义上讲是前端开发学科的代名词,包含HTML5.CSS3及JavaScript三个重要的部分,是运行在浏览器上应用的统称.如PC端网站 ...

  7. C# string 与 String的区别

    C# string 与 String的区别 The string type represents a string of Unicode characters. string is an alias ...

  8. python2/3中 将base64数据写成图片,并将图片数据转为16进制数据的方法、bytes/string的区别

    1.python2将base64数据写成图片,并将数据转为16进制字符串的方法 import binascii img = u'R0lGODlhagAeAIcAAAAAAAAARAAAiAAAzABE ...

  9. Java char 和 String 的区别: 字符编码及其存储

    一. ASCII码 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今.一个字节(8bit)一共 可以用来表示256种不同的状态 ...

随机推荐

  1. CJOJ 2307 【一本通】完全背包(动态规划)

    CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...

  2. Andorid源码系列:View的onTouchEvent()与performClick(),performLongClick()调用时机解析

    这是大土豆的第一篇博客,想着工作3年多了,在工作上从一名菜鸟逐渐成长为在项目中能干点事的人,自己对Android的见解也一步步加深,有必要写一些对Android代码和开发过程中的感悟,和广大朋友们分享 ...

  3. Hibernate 实体映射类的状态值自动转换

    经常会遇到有些字段在数据库只是一个 byte 值,但是取出数据后需要转换为真实的状态名称. 举个栗子:一个图书管理系统,书籍有一个属性 stat(借出状态),在库中只需要保存一个 0/1/2/3/4 ...

  4. (转)Spring并发访问的线程安全性问题(高度总结)

    下面的记录对spring中并发的总结.理论分析参考Spring中Singleton模式的线程安全,建议先看 spring中的并发访问题: 我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下 ...

  5. 机器学习(4)Hoeffding Inequality--界定概率边界

    问题 假设空间的样本复杂度(sample complexity):随着问题规模的增长导致所需训练样本的增长称为sample complexity. 实际情况中,最有可能限制学习器成功的因素是训练数据的 ...

  6. j2ee中的2是什么意思

    J2EE里面的2是什么意思 1998年Java 1.2版本发布,1999年发布Java 1.2的标准版,企业版,微型版三个版本,为了区分这三个版本,分别叫做Java2SE,Java2EE,Java2M ...

  7. phpMyAdmin安装部署

    phpMyAdmin 是一个用PHP编写的软件工具,可以通过web方式控制和操作MySQL数据库.通过phpMyAdmin 可以完全对数据库进行操作,例如建立.复制和删除数据等等.如果使用合适的工具, ...

  8. Linux(9)后台运行python程序并输出到日志文件

    后台运行python程序并标准输出到文件 现在有test.py程序要后台部署, 里面有输出内容 使用命令: nohup python -u test.py > test.log 2>&am ...

  9. python常用模块(2)

    之前学了两个常用的模块collections和re模块今天我们接着学习其他几个常用模块.都是比较常用的之前的学习或多或少也有所接触比如说时间模块等. 预习: 写一个验证码 首先 要有数字 其次 要有字 ...

  10. Sangmado 公共基础类库

    Sangmado 涵盖了支撑 .NET/C# 项目开发的最基础的公共类库,为团队在不断的系统开发和演进过程中发现和积累的最公共的代码可复用单元. Sangmado 公共类库设计原则: 独立性:不与任何 ...