分享:SringBuffer与String的区别

  ·作为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()。

时间: 2024-07-30 02:10:03

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

const char*、char*、char* const、char[]、string的区别

1.const char* p: p is a pointer to const char(char const* p 一样)   意思就是不能通过p指针来修改p指向的内容(但是内容可以修改).2.char* p      : p is a pointer to char   意思就是可通过p指针来修改p指向的内容3.char* const p: p is a const pointer to char   意思就是p指针是一个常指针,他指向的内存地址不能变,定义的时候就得初始化   一旦给指针

ArrayList和Vector的区别?HashMap和HashTable的区别?StringBuilder、StringBuffer和String的区别?

ArrayList和Vector的区别?从两个方面 1.同步性:ArrayList是线程不安全的,是非同步的:Vector是线程安全的,是同步的.(Java中线程的同步也就满足了安全性) 2.数值增长:ArrayList每次增长为原来的50%;Vector每次增长为原来的100%; (从内部实现机制来讲,ArrayList和Vector都是使用数组(Array)来控制集合中的对象,当向集合中添加对象时,如果内部数组长度不够用时,长度会自动增长.ArrayList会增长为原来的1.5倍,Vecto

[c# 20问] 3.String和string的区别

POINTS string类型为继承自object的sealed类. string类实例用来存储Unicode字符串. string关键字是System.String类的别名,因此既可以定义string name="Fred",也可以String name="Fred" 同样以也可以使用string.Concat()或String.Concat() 推荐定义变量名使用string,调用方法和引用使用String类 DEMO private static void S

python中string.casefold和string.lower区别

string.casefold和string.lower 区别 python 3.3 引入了string.casefold 方法,其效果和 string.lower 非常类似,都可以把字符串变成小写,那么它们之间有什么区别?他们各自的应用场景? 对 Unicode 的时候用 casefold string.casefold官方说明: Casefolding is similar to lowercasing but more aggressive because it is intended t

StringBuilder和String的区别

转:http://blog.163.com/zhaoyanping_1125/blog/static/201329153201204111726152/ 自己总结,简而言之,stringbuilder和string的区别在于: stringbuilder是变长的. string是定长的. 以下详细介绍String和StringBuilder的使用: --------------------------------------------------------------------------

String和string的区别

C#: string 是C#的语法支持的,而String 则是string 对应的真实CLR中的类型,也就是说string 应该只是String的一个别名. string 可以在不引用 任何命令空间的情况下使用.String 必须先引用 System命名空间. 当我们要用到类的方法时,就用String,如string str = String.Format("{0}",value);. string是C#的保留字,而String不是. JAVA: java只有大写的String和Str

String与string的区别

概述 本文主要讲解String与string 的区别,涉及String与string的具体知识不多. String String是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色) String始终代表 System.String(1.x) 或 ::System.String(2.0) ,String只有在前面有using System的时候并且当前命名空间中没有名为String的类型(class.struct.delegate.enum)的时候才代表Sy

string 和 String的区别

1 string类型是密封(sealed)类型,即从object对象中继承而来. 2 string实例实际就是一个Unicode字符串 3 string类型的值可以是字符串文字 4 string关键字是预定义类System.String的别名,所以我们可以这样写: string name = "Fred"; or String name = "Fred" 5 同样的你可以使用string.Concat() 或者 String.Concat() 6 string 通常

String 和 string 的区别

string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色)c# string映射为.net Framework的String如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作如果使用c#,建议使用string,比较符合规范string始终代表 System.String(1.x) 或 ::System.String(2.0) ,String只有在前面有using System;的时候并且当前命名