• 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()相同 只不过这种可以节省空间

    朱星翰

  • 相关阅读:
    排序算法研究
    SqlParameters参数
    winfrom项目
    方法参数中有out和in关键字是什么意思?
    在C#中使用存储过程
    11Book系列多表群操作
    7drf过滤排序分页异常处理
    12RBAC基于角色的访问控制
    5drf路由组件
    8drf自动生成接口文档
  • 原文地址:https://www.cnblogs.com/yzssoft/p/7081681.html
Copyright © 2020-2023  润新知