# Java源码之StringBuffer **Repository Path**: fpfgitmy_admin/java-source-code-stringbuffer ## Basic Information - **Project Name**: Java源码之StringBuffer - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-28 - **Last Updated**: 2021-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #### String、StringBuffer、StringBuilder简单示意 ``` package com.felixfei.study.test; /** * @describle 关于StringBuffer和StringBuilder测试 */ public class StringBufferBuilderTest { /* String、StringBuffer、StringBuilder三者异同 String:不可变的字符序列、底层使用不可变的(添加了final)char[]存储 StringBuffer:可变的字符序列、线程安全的(效率低)、底层使用可变的(没有添加final)char[]存储 StringBuilder:可变的字符序列、线程不安全(效率高)、底层使用可变的(没有添加final)char[]存储 为什么String用final?StringBuffer、StringBuilder不使用final? String每次赋值(不包含相同值)都会返回新的值(在常量池中开辟新的地址) 而StringBuffer和StringBuilder直接修改常量池中的数据(在原有的基础上变) */ public static void main(String[] args) { StringBuffer sb1 = new StringBuffer("abc"); sb1.setCharAt(0, 'm'); System.out.println(sb1); } } ``` ##### StringBuffer源码分析 ``` package com.felixfei.study.test; /** * @describle 关于StringBuffer和StringBuilder测试 *

* 1. StringBuffer的起始容量是16 */ public class StringBufferBuilderTest { /* String str = new String(); // new char[0]; String str1 = new String("abc"); // new char[]{'a','b','c'}; StringBuffer sb1 = new StringBuffer();//new char[16];底层创建了一个长度是16的数组 sb1.append('a');//value[0] = 'a'; 相当于把sb1的char数组第1个替换成 'a' StringBuffer sb2 = new StringBuffer("abc");// new char["abc".length()+16]; 初始化容量 */ public static void main(String[] args) { StringBuffer sb2 = new StringBuffer("abc"); System.out.println(sb2.length()); //返回count 3 // 问题1.返回的length为含有数据的count(不是初始化容量) // 问题2.扩容问题:默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。 StringBuffer sb3 = new StringBuffer(20); // 开发中建议使用 sb3这种指定容量的方式,有一点,要明确知道本身要扩容多少次 } } ``` ##### StringBuffer常用方法 ``` package com.felixfei.study.test; /** * @describle StringBuffer常用方法 */ public class StringBufferBuilderTest { public static void main(String[] args) { StringBuffer sb = new StringBuffer(); sb.append("abc"); // 拼接字符串 System.out.println("拼接后的数据=" + sb); //abc sb.insert(1, "e"); // 在指定位置插入 System.out.println("插入后的数据=" + sb); //aebc sb.delete(0, 1); // 删除指定位置的内容 System.out.println("删除后的数据=" + sb); //ebc sb.replace(0, 1, "s"); //把[start,end]位置替换为str,[]代表相等,表示替换第一个和第二个元素为c System.out.println("替换后的数据=" + sb); // sbc sb.reverse(); //把当前字符序列逆转 System.out.println("逆转后的数据=" + sb); // cbs int length = sb.length(); System.out.println("字符串的长度=" + length); String substring = sb.substring(1, 2); System.out.println("切割的数据=" + substring); } } ```