java基础20 StringBuffer缓冲类

1、概要

    StringBuffer 其实就是一个存储字符的容器

字符串特点:字符串是常量;它们创建之后不能更改了
字符串一旦发生变化,那么立马创建一个新的对象。
注意:字符串的内容不适合频繁修改的,因为一旦修改马上就会创建一个新的对象但是需要重复修改字符串的内容,建议使用字符串缓冲类(stringBuffer)

笔试题目:使用StringBuffer无参构造器创建一个对象时,默认初始容量多少?如果长度不够使用,自动增长多少倍?
        StringBuffer底层依赖字符数组才能存储字符数据,该字符串数组的默认初始容量是16,如果字符数组长度不够用自动增长1倍

2、StringBuffer 与 StringBuillder的区别

2.1、相同点
    1.两个类都是字符串缓冲类
    2.两个类的方法都是一样的
2.2、不同点
    1.StringBuffer是线程安全的,操作效率低,StringBuillder是非线程安全的,操作效率高.
    2.StringBuffer出现jdk1.0的,StringBuillder是jdk1.5的时候出现的
推荐使用:StringBuillder,因为操作效率高.

3、StringBuffer和String的区别

    1、String对象是不可变的对象,当我们每次操作string都会重写新建对象来保存值
    2、StringBuffer对象一旦实例化,只对这一个对象操作

 1 package com.bw.string;
 2 
 3 public class Demo4 {
 4     public static void main(String[] args) {
 5         String str="abc";
 6         StringBuffer sb=new StringBuffer("abc");
 7         Runtime runtime=Runtime.getRuntime();
 8         long startTime=System.currentTimeMillis();
 9         long startfreeMemory=runtime.freeMemory();
10         for(int i=0;i<10000;i++){
11             //str+=i; //运行结果:操作耗时:492ms,内存消耗:8161KB
12             sb.append(i); //运行结果:操作耗时:10ms,内存消耗:147KB
13            //重新再运行的结果也是:StringBuffer的效率比String的高
14         }
15         long endfreeMemory=runtime.freeMemory();
16         long endTime=System.currentTimeMillis();
17         
18         System.out.println("操作耗时:"+(endTime-startTime)+"ms,"+"内存消耗:"+(startfreeMemory-endfreeMemory)/1024+"KB");
19     }
20 }

4、StringBuffer下的常用方法(函数)

4.1、容器具备的行为

 4.1.1、增加
      append(boolean b) :可以添加任意类型的数据到容器中
      insert(int offset, boolean b):指定插入的索引值,插入对应的内容
 4.1.2、删除
     delete(int start, int end) :根据指定的开始与结束的索引值删除对应内容
     deleteCharAt(int index):根据指定的索引删除一个字符
 4.1.3、修改
     replace(int start, int end, String str) :根据开始和结束的两个索引值,替换对应的内容。
     reverse() :倒序
     setCharAt(int index, char ch) :根据指定的索引值,替换一个字符
     substring(int start, int end) :根据指定的开始和结束的索引值,来截取对应的字符串
     ensureCapacity(int minimumCapacity):确保容量至少等于规定的最小值        ensureCapacity的使用,在中间靠下的位置(第四点)
4.1.4、查看
     indexOf(String str) 返回指定子字符串第一次出现的字符串内的索引
     lastIndexOf(String str) 返回指定子字符串最右边(即最后)出现的字符串内的索引
     capacity() 返回当前容量          capacity()的使用详解
     length() 返回长度(字符数)
     charAt(int index) 返回指定索引值对应的(一个)字符
     toString()返回表示此顺序中的数据的字符串

5、例子

 1 package com.dhb.code;
 2 
 3 public class Demo6 {
 4     public static void main(String[] args) {
 5         //先使用StringBuffer无参构函数创建一个字符串缓冲类
 6         StringBuffer sb=new StringBuffer();
 7         
 8         /** 添加 */
 9         sb.append("abcjavadefg").append("QWE");
10         sb.append(true);
11         System.out.println(sb); //运行结果:abcjavadefgQWEtrue
12         sb.insert(1,"sb.杨桃");
13         System.out.println(sb); //结果:asb.杨桃bcjavadefgQWEtrue
14         
15         /** 删除 */
16         sb.delete(1,3);
17         System.out.println(sb); //运行结果:a.杨桃bcjavadefgQWEtrue
18         sb.deleteCharAt(1);
19         System.out.println(sb);//结果:a杨桃bcjavadefgQWEtrue
20         
21         /** 修改 */
22         sb.replace(1, 4,"二狗子");
23         System.out.println(sb); //运行结果:a二狗子cjavadefgQWEtrue
24         sb.reverse();
25         System.out.println(sb); //结果:eurtEWQgfedavajc子狗二a
26         sb.setCharAt(1, '陈');
27         System.out.println(sb); //结果:e陈rtEWQgfedavajc子狗二a
28         
29         String s = sb.substring(16,19);
30         System.out.println(s);//结果:子狗二
31         
32         /** 查看 */
33         int i = sb.indexOf("狗");
34         System.out.println("查看字符数组的长度:"+sb.length());//长度为20
35         System.out.println(i); //运行结果:17
36         System.out.println(sb.lastIndexOf("a")); //结果:19
37         System.out.println(sb.charAt(2));//结果:r
38         System.out.println(sb.capacity());//结果:34     默认容量是16,该字符数组的长度为20,20>16,所以容量增加了一倍,即:(当前容量+1)*2。 (16+1)*2=34
39         System.out.println(sb.toString());//结果:e陈rtEWQgfedavajc子狗二a
40     }
41 }

原创作者:DSHORE

作者主页:http://www.cnblogs.com/dshore123/

原文出自:http://www.cnblogs.com/dshore123/p/8968801.html

欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

原文地址:https://www.cnblogs.com/dshore123/p/8968801.html