zoukankan      html  css  js  c++  java
  • String和stringbuffer

     很多人都会认为,String和StringBuffer没有多大的区别,但是String与StringBuffer的区别,就是一个变量和常量的关系。
        StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值就是两个对象。
        StringBuffer 的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串进行修改,使用StringBuffer要更加适合一些。
        在String类中没有用来改变已有字符串中的某个字符的方法,由于不能改变一个java字符串中的某个单独字符,所以在JDK文档中称String类的对象是不可改变的。然而,不可改变的字符串具有一个很大的优点:编译器可以把字符串设为共享的
        StringBuffer 类属于一种辅助类,可预先分配指定长度的内存块建立一个字符串缓冲区。这样使用StringBuffer类的append方法追加字符 比 String使用 + 操作符添加字符 到 一个已经存在的字符串后面有效率得多。
        因为使用 + 操作符每一次将字符添加到一个字符串中去时,字符串对象都需要寻找一个新的内存空间来容纳更大的字符串,这是一个非常消耗时间的操作。添加多个字符也 就意味着要一次又一次的对字符串重新分配内存。使用StringBuffer类就避免了这个问题。
        StringBuffer是线程安全的,在多线程程序中也可以很方便的进行使用,但是程序的执行效率相对来说就要稍微慢一些。


        下面就举一个例子来说明一下
       

        public static void main(String[] args) throws Exception{
            String str=new String();
            long start=System.currentTimeMillis();
            for(int i=0;i<50000;i++){
                str+=i+"";
            }
            long end=System.currentTimeMillis();
            System.out.println(end-start);
            StringBuffer strbuf=new StringBuffer();
            start=System.currentTimeMillis();
            for(int i=0;i<50000;i++){
                strbuf.append(i+"");
            }
            end=System.currentTimeMillis();
            System.out.println(end-start);
        }


        所用时间

    9216
    8
    

      这可以看出stringbuffer的速度

     但是,看上一个例子红色字体位置,我所用的string是每次添加不同的值,如果每次添加相同的值,因为栈内存中已经存在共享值,所以string不再创建新的内存,直接引用

        public static void main(String[] args) throws Exception{
            String str=new String();
            long start=System.currentTimeMillis();
            for(int i=0;i<50000;i++){
                str="abc";
            }
            long end=System.currentTimeMillis();
            System.out.println(end-start);
            StringBuffer strbuf=new StringBuffer();
            start=System.currentTimeMillis();
            for(int i=0;i<50000;i++){
                strbuf=new StringBuffer("abc");
            }
            end=System.currentTimeMillis();
            System.out.println(end-start);
        }
    0
    5
    

     这就是string的栈内存


        StringBuffer常用方法:
    1. append(str); 添加
      StringBudder strBuf=new StringBuffer("a");
      strBuf.append("bcdefghi");
      结果:bcdefghi
    2.deleteCharAt(int index); 删除第几个字节
      strBuf.append("abcdefghi");
      strBuf.deleteCharAt(0);
      结果:bcdefghi
    3.delete(int start,int end);删除从第几个到第几个
      strBuf.append("abcdefghi");
      strBuf.delete(1,3);
      结果:adefghi
    4.insert(int index,str);在什么位置添加什么内容
      strBuf.append("abcdefghi");
      strBuf.insert(1,"A");
      结果:aAdefghi
    5.reverse()将字段反转
      strBuf.append("abc");
      strBuf.reverse();
      结果:cba
    6.setCharAt(int index,char char) 修改字段
      注意 只能用char类型
      strBuf.append("abc");
      strBuf.setCharAt(1,‘B’);
      结果:aBc
    7.trimToSize() 字符个数
      和size()相同 只不过这种可以节省空间

    朱星翰

  • 相关阅读:
    UVA
    剑指offer 面试题11
    SharePoint 2013+ Sqlserver 2014 Kerberos 配置传奇, 最终的解决方案 验证。
    ASC(1)G(上升时间最长的序列)
    J2EE它是一个框架?平台?规范?
    C++和python使用struct传输二进制数据结构来实现
    前端开发面试题集(二)
    C语言中<CR>是什么意思
    Delphi ParamStr 使用方法
    打包工具 使用帮助 inno setup
  • 原文地址:https://www.cnblogs.com/yzssoft/p/7081681.html
Copyright © 2011-2022 走看看