String和StringBuilder底层原理,StringBuilder和StringBuffer的扩容机制

2022-07-08 09:29:13

String ,StringBuilder,StringBuffer使用场景

  • String 字符串类,底层是基于char[], 一旦创建长度就固定不变了,适用于字符串不经常增删改的操作的场景。

  • StringBuilder: 基于定长的char[],默认长度是16个,适用于频繁操作(增删改插)字符串的场景,该类是线程不安全的。

  • StringBuffer:基于定长的char[],默认长度是16个,适用于频繁操作(增删改插)字符串的场景,该类是线程安全的。

String的底层原理

publicclassStringTest{publicstaticvoidmain(String[] args){String str="abc";//表示在常量池中创建了一个长度是3的char数组String str2="abc";//优先从常量池中找到上面创建的3个长度char数组,当找不到的时候,会重新再常量池创建新的char数组System.out.println(str==str2);//判断两个对象地址是否相等System.out.println(str.equals(str2));//判断两个对象值是否相等String str3=newString("abc");String str4=newString("abc");System.out.println(str3==str4);System.out.println(str3.equals(str4));String str5="abc"+"d";//优先从常量池查找有没有 "abcd",有就直接用,没有就在常量池创建
        str+="d";//字符串拼接,表示在常量池中创建了一个新的char数组,长度是4个,并且将原来数组中的abc复制到了新数组System.out.println(str);System.out.println(str== str5);}}

在这里插入图片描述

StringBuilder的底层原理

publicclassStringBuilderTest{publicstaticvoidmain(String[] args){StringBuilder sb=newStringBuilder();// 创建一个默认16个长度的char[]数组StringBuilder sb2=newStringBuilder("abc");// 创建一个19个长度的char[]数组
        sb2.append("123456789");System.out.println(sb2);}}

在这里插入图片描述
StringBuilder无参构造方法默认在堆中创建16个长度的char[ ]数组,调用的是父类AbstractStringBuilder的构造方法,StringBuilder的有参构造方法在堆中创建参数的长度+16的char[ ]数组,添加的字符串依次从char[]数组前面为空的位置存入。当再次添加的字符串长度超过创建的char[ ]数组长度,就会进行扩容。

publicStringBuilder(){super(16);//默认创建16个长度的char[]数组}publicStringBuilder(String str){super(str.length()+16);//添加的字符串长度+16append(str);}

StringBuffer和StringBuilder扩容机制

当要添加的字符串大于 > 当前字符数组的长度的时候扩容,扩容是: 原来长度*2+2 的方式扩容。
底层源码实现如下:

privateintnewCapacity(int minCapacity){// overflow-conscious codeint newCapacity=(value.length<<1)+2;//新数组长度为(原数组长度2倍+2)if(newCapacity- minCapacity<0){
            newCapacity= minCapacity;}return(newCapacity<=0|| MAX_ARRAY_SIZE- newCapacity<0)?hugeCapacity(minCapacity): newCapacity;}
  • 作者:༄༊心灵骇客༣
  • 原文链接:https://blog.csdn.net/boyas/article/details/118675039
    更新时间:2022-07-08 09:29:13