1.Stringï¼StringBufferåStringBuilderçåºå«
2.stringbufferä¸stringbuilderçåºå«?源码
3.stringbuffer扩容为什么是2倍+2?
4.StringBuilder为ä»ä¹çº¿ç¨ä¸å®å
¨ï¼
Stringï¼StringBufferåStringBuilderçåºå«
javaä¸StringãStringBufferãStringBuilderæ¯ç¼ç¨ä¸ç»å¸¸ä½¿ç¨çå符串类ï¼ä»ä»¬ä¹é´çåºå«ä¹æ¯ç»å¸¸å¨é¢è¯ä¸ä¼é®å°çé®é¢ãç°å¨æ»ç»ä¸ä¸ï¼ççä»ä»¬çä¸åä¸ç¸åã1.å¯åä¸ä¸å¯å
ããStringç±»ä¸ä½¿ç¨å符æ°ç»ä¿åå符串ï¼å¦ä¸å°±æ¯ï¼å 为æâfinalâ修饰符ï¼æ以å¯ä»¥ç¥éstring对象æ¯ä¸å¯åçã
ããããprivate final char value[];
ããStringBuilderä¸StringBufferé½ç»§æ¿èªAbstractStringBuilderç±»ï¼å¨AbstractStringBuilderä¸ä¹æ¯ä½¿ç¨å符æ°ç»ä¿åå符串ï¼å¦ä¸å°±æ¯ï¼å¯ç¥è¿ä¸¤ç§å¯¹è±¡é½æ¯å¯åçã
ããããchar[] value;
2.æ¯å¦å¤çº¿ç¨å®å ¨
ããStringä¸ç对象æ¯ä¸å¯åçï¼ä¹å°±å¯ä»¥ç解为常éï¼æ¾ç¶çº¿ç¨å®å ¨ã
ããAbstractStringBuilderæ¯StringBuilderä¸StringBufferçå ¬å ±ç¶ç±»ï¼å®ä¹äºä¸äºå符串çåºæ¬æä½ï¼å¦expandCapacityãappendãinsertãindexOfçå ¬å ±æ¹æ³ã
ããStringBuffer对æ¹æ³å äºåæ¥éæè 对è°ç¨çæ¹æ³å äºåæ¥éï¼æ以æ¯çº¿ç¨å®å ¨çãçå¦ä¸æºç ï¼
1 public synchronized StringBuffer reverse() {2 super.reverse();
3 return this;
4 }
5
6 public int indexOf(String str) {
7 return indexOf(str, 0); //åå¨ public synchronized int indexOf(String str, int fromIndex) æ¹æ³
8 }
ããStringBuilder并没æ对æ¹æ³è¿è¡å åæ¥éï¼æ以æ¯é线ç¨å®å ¨çã
3.StringBuilderä¸StringBufferå ±åç¹
ããStringBuilderä¸StringBufferæå ¬å ±ç¶ç±»AbstractStringBuilder(æ½è±¡ç±»)ã
ããæ½è±¡ç±»ä¸æ¥å£çå ¶ä¸ä¸ä¸ªåºå«æ¯ï¼æ½è±¡ç±»ä¸å¯ä»¥å®ä¹ä¸äºåç±»çå ¬å ±æ¹æ³ï¼åç±»åªéè¦å¢å æ°çåè½ï¼ä¸éè¦éå¤åå·²ç»åå¨çæ¹æ³ï¼èæ¥å£ä¸åªæ¯å¯¹æ¹æ³çç³æå常éçå®ä¹ã
ããStringBuilderãStringBufferçæ¹æ³é½ä¼è°ç¨AbstractStringBuilderä¸çå ¬å ±æ¹æ³ï¼å¦super.append(...)ãåªæ¯StringBufferä¼å¨æ¹æ³ä¸å synchronizedå ³é®åï¼è¿è¡åæ¥ã
ããæåï¼å¦æç¨åºä¸æ¯å¤çº¿ç¨çï¼é£ä¹ä½¿ç¨StringBuilderæçé«äºStringBufferã
stringbufferä¸stringbuilderçåºå«?
äºè çåºå«ä¸»è¦æ¯å¨è¿è¡é度å线ç¨å®å ¨è¿ä¸¤æ¹é¢ã1ãStringBuffer ä¸ StringBuilder ä¸çæ¹æ³ååè½å®å ¨æ¯çä»·ç
2ãåªæ¯StringBuffer ä¸çæ¹æ³å¤§é½éç¨äº synchronized å ³é®åè¿è¡ä¿®é¥°ï¼å æ¤æ¯çº¿ç¨å®å ¨çï¼è StringBuilder 没æè¿ä¸ªä¿®é¥°ï¼å¯ä»¥è¢«è®¤ä¸ºæ¯çº¿ç¨ä¸å®å ¨çã
3ãå¨å线ç¨ç¨åºä¸ï¼StringBuilderæçæ´å¿«ï¼å 为å®ä¸éè¦å éï¼ä¸å ·å¤å¤çº¿ç¨å®å ¨èStringBufferåæ¯æ¬¡é½éè¦å¤æéï¼æçç¸å¯¹æ´ä½ã
stringbuffer扩容为什么是2倍+2?
在常规用法中,StringBuffer和StringBuilder在功能上差别不大,分析主要区别在于StringBuffer具备线程安全性,源码但效率相对较低,分析而StringBuilder则线程不安全但效率更高。源码不过在扩容机制上,分析奶块钓鱼源码两者一致。源码下面以StringBuffer为例进行深入分析。分析
首先,源码追踪StringBuffer源码,分析发现它继承自AbstractStringBuilder。源码这意味着StringBuffer和StringBuilder是分析“亲兄弟”,拥有共同的源码淘宝分类源码抽象父类AbstractStringBuilder。在这个抽象类中,分析定义了字符串存储的源码定长字节数组,并在追加字符串时,当长度超过数组长度时,通过数组复制方式实现扩容。
容量设置上,网游源码修改StringBuffer提供了默认容量和自定义容量的构造方法,即使默认构造方法也会设置初始容量为。在实际开发中,容量不足时,通过append()方法追加字符串触发动态扩容。
append()方法实际上调用的逸仙诀 源码是AbstractStringBuilder的append()方法,进入内部后,发现关键在于ensureCapacityInternal()方法。该方法确保内部容量足够,通过count+len参数计算追加后字符串总长度,实现动态扩容。
在ensureCapacityInternal()方法中,交友视频源码首先利用二进制位右移运算计算数组原有容量,考虑到编码方式(默认Latin1或UTF-),判断新字符串长度是否超过原有容量。若超过,则利用Arrays.copyOf()方法复制并创建新数组,将当前数组值赋给新数组,完成扩容。
newCapacity()方法计算扩容后数组长度,通常在新字符串长度基础上增加一定比例,确保足够容纳新追加的字符串。而新长度计算逻辑通常涉及Math.max()方法,确保不会超出Integer最大值,避免内存溢出异常。
StringBuffer扩容机制核心如下:若一次追加字符串长度超过当前容量,扩容规则为当前容量*2+2;如果追加长度超出初始容量且按当前容量*2+2扩容后仍不足,直接扩容至与新字符串长度相等;后续追加继续遵循当前容量*2+2规则。扩容为2倍+2的原因是为了减少内存分配次数和内存碎片,提高性能和效率。
为了验证上述规则,可设计实验案例,观察StringBuffer与StringBuilder的扩容表现。至此,详细解释了StringBuffer扩容机制及其规则,希望能对理解Java中字符串操作有所帮助。
StringBuilder为ä»ä¹çº¿ç¨ä¸å®å ¨ï¼
æ ¸å¿æ示ï¼å¨åé¢çé¢è¯é¢è®²è§£ä¸æ们对æ¯äºStringãStringBuilderåStringBufferçåºå«ï¼å ¶ä¸ä¸é¡¹ä¾¿æå°StringBuilderæ¯é线ç¨å®å ¨çï¼é£ä¹æ¯ä»ä¹åå 导è´äºStringBuilderç线ç¨ä¸å®å ¨å¢ï¼åå åæå¦æä½ çäºStringBuilderæStringBufferçæºä»£ç ä¼è¯´ï¼å 为StringBuilderå¨appendæä½æ¶å¹¶æªä½¿ç¨çº¿ç¨åæ¥ï¼èStringBufferå ä¹å¤§é¨åæ¹æ³é½ä½¿ç¨äºsynchronizedå ³é®åè¿è¡æ¹æ³çº§å«çåæ¥å¤çãä¸é¢è¿ç§è¯´æ³è¯å®æ¯æ£ç¡®çï¼å¯¹ç §
å¨åé¢çé¢è¯é¢è®²è§£ä¸æ们对æ¯äºStringãStringBuilderåStringBufferçåºå«ï¼å ¶ä¸ä¸é¡¹ä¾¿æå°StringBuilderæ¯é线ç¨å®å ¨çï¼é£ä¹æ¯ä»ä¹åå 导è´äºStringBuilderç线ç¨ä¸å®å ¨å¢ï¼
åå åæ
å¦æä½ çäºStringBuilderæStringBufferçæºä»£ç ä¼è¯´ï¼å 为StringBuilderå¨appendæä½æ¶å¹¶æªä½¿ç¨çº¿ç¨åæ¥ï¼èStringBufferå ä¹å¤§é¨åæ¹æ³é½ä½¿ç¨äºsynchronizedå ³é®åè¿è¡æ¹æ³çº§å«çåæ¥å¤çã
ä¸é¢è¿ç§è¯´æ³è¯å®æ¯æ£ç¡®çï¼å¯¹ç §ä¸ä¸StringBuilderåStringBufferçé¨åæºä»£ç ä¹è½å¤çåºæ¥ã
StringBuilderçappendæ¹æ³æºä»£ç ï¼
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
StringBufferçappendæ¹æ³æºä»£ç ï¼
@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}