zoukankan      html  css  js  c++  java
  • JAVA中String与StringBuffer的区别

    String和StringBuffer的区别,网上资料可以说是数不胜数,但是看到这篇文章,感觉里面做的小例子很有代表性,所以转一下,并自己做了一点总结。

     

    在java中有3个类来负责字符的操作。

    1.Character 是进行单个字符操作的,

    2.String 对一串字符进行操作。不可变类。

    3.StringBuffer 也是对一串字符进行操作,但是可变类。

    String:
    是对象不是原始类型.
    为不可变对象,一旦被创建,就不能修改它的值.
    对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.
    String 是final类,即不能被继承.

    StringBuffer:
    是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象
    它只能通过构造函数来建立,
    StringBuffer sb = new StringBuffer();
    note:不能通过付值符号对他进行付值. 
    sb = "welcome to here!";//error
    对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer
    中付值的时候可以通过它的append方法.
    sb.append("hello");

    字符串连接操作中StringBuffer的效率要比String高:

    String str = new String("welcome to ");
    str += "here";
    的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
    再将StringBuffer toSting();
    这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.

    并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值.
    这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的. 

    看看以下代码:
    将26个英文字母重复加了5000次,

    1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
    2.         int times = 5000;
    3.         long lstart1 = System.currentTimeMillis();
    4.         String str = "";
    5.         for (int i = 0; i < times; i++) {
    6.             str += tempstr;
    7.         }
    8.         long lend1 = System.currentTimeMillis();
    9.         long time = (lend1 - lstart1);
    10.         System.out.println(time);

    可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。
    也就是46秒。
    我们再看看以下代码

    1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
    2.         int times = 5000;
    3.         long lstart2 = System.currentTimeMillis();
    4.         StringBuffer sb = new StringBuffer();
    5.         for (int i = 0; i < times; i++) {
    6.             sb.append(tempstr);
    7.         }
    8.         long lend2 = System.currentTimeMillis();
    9.         long time2 = (lend2 - lstart2);
    10.         System.out.println(time2);

    得到的结果为 16 有时还是 0
    所以结论很明显,StringBuffer 的速度几乎是String 上万倍。当然这个数据不是很准确。因为循环的次数在100000次的时候,差异更大。不信你试试。

     

    根据上面所说:

    str += "here";
    的处理步骤实际上是通过建立一个StringBuffer,让侯调用append(),最后
    再将StringBuffer toSting();

    所以str += "here";可以等同于

    StringBuffer sb = new StringBuffer(str);

    sb.append("here");

    str = sb.toString();

    所以上面直接利用"+"来连接String的代码可以基本等同于以下代码

    1.         String tempstr = "abcdefghijklmnopqrstuvwxyz";
    2.         int times = 5000;
    3.         long lstart2 = System.currentTimeMillis();
    4.         String str = "";
    5.         for (int i = 0; i < times; i++) {
    6.             StringBuffer sb = new StringBuffer(str);
    7.             sb.append(tempstr);
    8.             str = sb.toString();
    9.         }
    10.         long lend2 = System.currentTimeMillis();
    11.         long time2 = (lend2 - lstart2);
    12.         System.out.println(time2);

    平均执行时间为46922左右,也就是46秒。

     

    总结: 如果在程序中需要对字符串进行频繁的修改连接操作的话.使用StringBuffer性能会更高

    StringBuffer的常用方法

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

    aappend方法

             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”。

    bdeleteCharAt方法

             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”

                       cinsert方法

                                public StringBuffer insert(int offset, boolean b)

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

                                         StringBuffer sb = new StringBuffer(“TestString”);

                                         sb.insert(4,false);

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

                       dreverse方法

                                public StringBuffer reverse()

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

             StringBuffer sb = new StringBuffer(“abc”);

             sb.reverse();

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

                       esetCharAt方法

                                public void setCharAt(int index, char ch)

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

                                         StringBuffer sb = new StringBuffer(“abc”);

                                         sb.setCharAt(1,’D’);

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

                       ftrimToSize方法

                                public void trimToSize()

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


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Candy leetcode java
    Trapping Rain Water leetcode java
    Best Time to Buy and Sell Stock III leetcode java
    Best Time to Buy and Sell Stock II leetcode java
    Best Time to Buy and Sell Stock leetcode java
    Maximum Subarray leetcode java
    Word Break II leetcode java
    Word Break leetcode java
    Anagrams leetcode java
    Clone Graph leetcode java(DFS and BFS 基础)
  • 原文地址:https://www.cnblogs.com/shipeng22022/p/4614136.html
Copyright © 2011-2022 走看看