作者:海蓝透了我的心 | 来源:互联网 | 2023-09-18 20:21
1.String、StringBuffer、StringBuilder的异同? 相同点:底层使用char[]进行存储 不同点: String:不可变的字符序列 StringBuffer:可变的字符序列:线程安全的(可同步访问),效率低; StringBuilder:jdk5.0新增,与StringBuffer一样是可变的字符序列,但线程不安全的,所以效率较高; 2.String、StringBuffer、StringBuilder三者的效率从高到低排列应该是什么顺序? 从高到低:StringBuilder > StringBuffer > String; 3.开发中建议 根据线程安全来选择使用: StringBuffer(int capacity) / StringBuilder(int capacity);
源码分析String、StringBuffer、StringBuilder底层存储与预分配内存
tips: 1.System.out.println(sb2.length()); // 3, StringBuffer底层会默认给到16个数组位置,如果你创建了3个,则就代表StringBuffer底层分配给你3+16=19个可以存放数组的位置,但是我初始化只用到3个,那么数组长度就还是3。 比如:一个房间可以占满100个人,但是只进去了10个人,要问房间现在的容量是多少?那当然是10,而不是100. 2.扩容问题:如果要添加的数据底层数组盛不下了,就需要扩容数组; 默认情况下,扩容为原来容量capacity的2倍+2,同时将原有数组中的元素复制到新的数组中。
eg:
StringBuffer sb = new StringBuffer ( ) ; System. out. println ( sb. length ( ) ) ;
StringBuffer的常用方法 /StringBuilder相同
注:涉及到start与end位置的,都是左闭右开[start,end)!!
增: StringBuffer append(xxx); 删: StringBuffer delete(int start, int end): 删除指定[start,end)位置的内容; 改:public void setCharAt(int n ,char ch) / StringBuffer replace(int start, int end, String str):把[start, end)位置替换为str; 查:public char charAt(int n); 插: StringBuffer insert(int offset, xxx): 在指定位置插入xxx; 长度:public int length();
增删改查插可不需返回值,即直接调用append() / delete() / setCharAt() / charAt() / insert()方法。 ------------------------------------------------------------------------------------------------常用------------------------------------------------------------ StringBuffer reverse() :对当前字符序列进行逆转操作 public int indexOf(String str): public String substring(int start, int end):返回[start,end)区间的子字符串,不是切割当前字符串,所以得需要返回值。
@Test public void test ( ) { StringBuffer s1 = new StringBuffer ( "abc" ) ; s1. append ( 1 ) ; s1. append ( '2' ) ; System. out. println ( s1) ; s1. replace ( 2 , 4 , "hello" ) ; System. out. println ( s1) ; System. out. println ( s1. length ( ) ) ; s1. delete ( 2 , 4 ) ; System. out. println ( s1) ; s1. insert ( 2 , false ) ; System. out. println ( s1) ; System. out. println ( s1. length ( ) ) ; s1. reverse ( ) ; System. out. println ( s1) ; String s2 = s1. substring ( 1 , 3 ) ; System. out. println ( s2) ; }
== tips: substring()方法是纯小写!!==
对比String、StringBuffer、StringBuilder三者的效率 &#64;Test public void test ( ) { long startTime &#61; 0 L; long endTime &#61; 0 L; String text &#61; "" ; StringBuffer buffer &#61; new StringBuffer ( "" ) ; StringBuilder builder &#61; new StringBuilder ( "" ) ; startTime &#61; System. currentTimeMillis ( ) ; for ( int i &#61; 0 ; i < 10000 ; i&#43;&#43; ) { buffer. append ( String. valueOf ( i) ) ; } endTime &#61; System. currentTimeMillis ( ) ; System. out. println ( "StringBuffer的执行时间为&#xff1a;" &#43; ( endTime - startTime) ) ; startTime &#61; System. currentTimeMillis ( ) ; for ( int i &#61; 0 ; i < 10000 ; i&#43;&#43; ) { builder. append ( String. valueOf ( i) ) ; } endTime &#61; System. currentTimeMillis ( ) ; System. out. println ( "StringBuilder的执行时间为&#xff1a;" &#43; ( endTime - startTime) ) ; startTime &#61; System. currentTimeMillis ( ) ; for ( int i &#61; 0 ; i < 10000 ; i&#43;&#43; ) { text &#61; text &#43; i; } endTime &#61; System. currentTimeMillis ( ) ; System. out. println ( "String的执行时间为&#xff1a;" &#43; ( endTime - startTime) ) ; }
运行结果&#xff1a;