Java基礎(chǔ)之StringBuffer詳解
一、前言
StringBuffer是可變長的字符串
1.append 追加
2.delete 刪除
3.insert 插入
4.reverse 反轉(zhuǎn)
二、用法
String str1 = "let there ";
StringBuffer sb = new StringBuffer(str1); //根據(jù)str1創(chuàng)建一個StringBuffer對象
sb.append("be light"); //在最后追加
System.out.println(sb);
sb.delete(4, 10);//刪除4-10之間的字符 不包括4,包括10
System.out.println(sb);
sb.insert(4, "there ");//在4這個位置插入 there 在4的位置后面插入
System.out.println(sb);
sb.reverse(); //反轉(zhuǎn) 字符串的內(nèi)容倒序
System.out.println(sb);
三、結(jié)果
let there be light let be light let there be light thgil eb ereht tel
注意:
對于插入insert和append
邊界條件判斷
插入之前,首先要判斷的是一些邊界條件,比如插入位置是否合法,插入的字符是否為空
擴(kuò)容
1.要判斷是否需要擴(kuò)容,如果插入的字符串加上原來的總長度超過了初始容量,就需要擴(kuò)容。
2.數(shù)組的長度是固定且不能改變的,所以數(shù)組本身不支持?jǐn)U容。這時需要其他方式解決問題------------------
根據(jù)需要插入的字符串的長度和已經(jīng)存在的內(nèi)容的長度,計算出一個新的容量,再根據(jù)這個容量創(chuàng)建一個新的數(shù)組,把原來數(shù)組中的內(nèi)容復(fù)制到新的數(shù)組中,讓value這個引用指向新的數(shù)組,從而達(dá)到擴(kuò)容的效果。
插入字符串
1.找到要插入字符串的位置,從這個位置開始,把原數(shù)據(jù)看成兩段,把后半段向后挪動一個距離,這個距離剛好是插入字符串的長度。
2.然后把要插入的數(shù)據(jù),插入這個挪出來的,剛剛好的位置里。
修改length的值
最后修改length的值,是原來的值加上插入字符串的長度
insert(int, char)
參數(shù)是字符的insert方法,通過調(diào)用insert(int, String) 也就實(shí)現(xiàn)了。
append
追加,就是在最后位置插入。 所以不需要單獨(dú)開發(fā)方法,直接調(diào)用insert方法,就能達(dá)到最后位置插入的效果
四、長度 容量
和String內(nèi)部是一個字符數(shù)組一樣,StringBuffer也維護(hù)了一個字符數(shù)組,但這個數(shù)組留有多余的長度,以便于在現(xiàn)有的數(shù)組上調(diào)用插入和追加,例如
String str = new StringBuffer("the"),//內(nèi)部的字符數(shù)組的長度是19而不是3,如果追加的長度超過了19,就會分配一個新的數(shù)組,長度比原來多,把原來的數(shù)據(jù)復(fù)制到新的數(shù)組中,看上去數(shù)組長度就變長了
不同的JDK數(shù)量不一樣
五、IStringBuffer接口
public interface IStringBuffer {
public void append(String str); //追加字符串
public void append(char c); //追加字符
public void insert(int pos,char b); //指定位置插入字符
public void insert(int pos,String b); //指定位置插入字符串
public void delete(int start); //從開始位置刪除剩下的
public void delete(int start,int end); //從開始位置刪除結(jié)束位置-1
public void reverse(); //反轉(zhuǎn)
public int length(); //返回長度
}
六、value和capacity
value: 用于存放字符數(shù)組
capacity: 容量
無參構(gòu)造方法: 根據(jù)容量初始化value
public class MyStringBuffer implements IStringBuffer{
int capacity = 16;
int length = 0;
char[] value;
public MyStringBuffer(){
value = new char[capacity];
}
@Override
public void append(String str) {
// TODO Auto-generated method stub
}
@Override
public void append(char c) {
// TODO Auto-generated method stub
}
@Override
public void insert(int pos, char b) {
// TODO Auto-generated method stub
}
@Override
public void delete(int start) {
// TODO Auto-generated method stub
}
@Override
public void delete(int start, int end) {
// TODO Auto-generated method stub
}
@Override
public void reverse() {
// TODO Auto-generated method stub
}
@Override
public int length() {
// TODO Auto-generated method stub
return 0;
}
}
以下是 StringBuffer 類支持的主要方法:
| 序號 | 方法描述 |
| 1 | public StringBuffer append(String s) 將指定的字符串追加到此字符序列。 |
| 2 | public StringBuffer reverse() 將此字符序列用其反轉(zhuǎn)形式取代。 |
| 3 | public delete(int start, int end) 移除此序列的子字符串中的字符。 |
| 4 | public insert(int offset, int i) 將 int 參數(shù)的字符串表示形式插入此序列中。 |
| 5 | replace(int start, int end, String str) 使用給定 String 中的字符替換此序列的子字符串中的字符。 |
**注意:**String 類是不可改變的,所以你一旦創(chuàng)建了 String 對象,那它的值就無法改變了
string1.concat(string2);字符串連接
"我的名字是 ".concat("Runoob");
更常用的是使用'+'操作符來連接字符串,如:
"Hello," + " runoob" + "!"
Java 中 StringBuffer 和 String 是有一定的區(qū)別的,首先,String 是被 final 修飾的,他的長度是不可變的,就算調(diào)用 String 的 concat 方法,那也是把字符串拼接起來并重新創(chuàng)建一個對象,把拼接后的 String 的值賦給新創(chuàng)建的對象,而 StringBuffer 的長度是可變的,調(diào)用StringBuffer 的 append 方法,來改變 StringBuffer 的長度,并且,相比較于 StringBuffer,String 一旦發(fā)生長度變化,是非常耗費(fèi)內(nèi)存的!
String 長度大小不可變
StringBuffer 和 StringBuilder 長度可變
StringBuffer 線程安全 StringBuilder 線程不安全
StringBuilder 速度快
到此這篇關(guān)于Java基礎(chǔ)之StringBuffer詳解的文章就介紹到這了,更多相關(guān)java StringBuffer詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中String StringBuffer和StringBuilder的區(qū)別詳解
- java中String、StringBuffer與StringBuilder的區(qū)別
- JAVA基礎(chǔ)類庫之String類,StringBuffer類和StringBuilder類
- java中StringBuffer的length()和capacity()方法對比
- Java利用StringBuffer替換特殊字符的方法實(shí)現(xiàn)
- java中stringbuffer線程安全分析實(shí)例詳解
- Java常用類庫StringBuffer,Runtime,日期操作類等類庫總結(jié)
- java String、StringBuilder和StringBuffer的區(qū)別詳解
- Java 基礎(chǔ)全面講解StringBuffer類的使用
相關(guān)文章
MyBatis實(shí)現(xiàn)批量插入數(shù)據(jù),多重forEach循環(huán)
這篇文章主要介紹了MyBatis實(shí)現(xiàn)批量插入數(shù)據(jù),多重forEach循環(huán)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
springboot整合shiro實(shí)現(xiàn)登錄驗證授權(quán)的過程解析
這篇文章主要介紹了springboot整合shiro實(shí)現(xiàn)登錄驗證授權(quán),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
Java中system.exit(0) 和 system.exit(1)區(qū)別
本文主要介紹了Java中system.exit(0) 和 system.exit(1)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05
如何去除Java中List集合中的重復(fù)數(shù)據(jù)
這篇文章主要介紹了Java中List集合去除重復(fù)數(shù)據(jù)的方法,對大家的工作或?qū)W習(xí)有一定價值,有需求的朋友可以參考下2020-05-05
Java如何實(shí)現(xiàn)海量數(shù)據(jù)判重
在海量數(shù)據(jù)如何確定一個值是否存在?這是一道非常經(jīng)典的面試場景題,那怎么回答這個問題呢?下面小編就來和大家詳細(xì)的聊一聊,感興趣的可以一起學(xué)習(xí)一下2023-09-09
JAVA構(gòu)造函數(shù)不能使用void關(guān)鍵字問題
這篇文章主要介紹了JAVA構(gòu)造函數(shù)不能使用void關(guān)鍵字問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03

