本發(fā)明涉及軟件開發(fā)技術(shù)領(lǐng)域,特別涉及一種字符拼接方法及裝置。
背景技術(shù):
在計(jì)算設(shè)備中,內(nèi)存資源是軟件/應(yīng)用運(yùn)行時需占用和爭奪的最主要資源之一,合理有效的內(nèi)存分配和管理是提高軟件/應(yīng)用運(yùn)行速度和增強(qiáng)系統(tǒng)穩(wěn)定性的關(guān)鍵手段。在軟件編程領(lǐng)域內(nèi)存的規(guī)劃和管理尤為重要,因程序在調(diào)試和編譯過程中會不停創(chuàng)建和使用各類數(shù)據(jù),無論什么樣的數(shù)據(jù)結(jié)構(gòu)都需要占用一定的內(nèi)存空間,若不能有效管理內(nèi)存,勢必會嚴(yán)重影響系統(tǒng)效率和穩(wěn)定性。
現(xiàn)有技術(shù)中,無論使用哪種開發(fā)語言、開發(fā)工具或開發(fā)哪類軟件,無一例外地,軟件編程過程中對于字符串(String)的處理最為頻繁,因?yàn)椋旱谝?,真?shí)世界的大部分事物大都能通過字符串來描述;第二,字符串的文字內(nèi)容是計(jì)算機(jī)信息與人類交互最直白的形式之一;第三,字符串也是程序、計(jì)算機(jī)之間通信方式。基于上述三點(diǎn),軟件編程過程中總會面對大量的字符串拼接操作,而無論采用哪種數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)(最常見的以數(shù)組實(shí)現(xiàn)),每一個字符串創(chuàng)建和拼接都會占用一定的內(nèi)存空間,當(dāng)存在大量且頻繁地創(chuàng)建和拼接字符串行為時,會對計(jì)算設(shè)備的內(nèi)存資源造成嚴(yán)重的占用,除造成內(nèi)存空間緊張外,更會對系統(tǒng)整體的運(yùn)行效率和穩(wěn)定性帶來嚴(yán)重影響。
現(xiàn)有技術(shù)中,最常見的字符串拼接方式為使用“+”操作符,該方式每次操作都會新建不同的String對象,這不僅效率低下且造成了內(nèi)存資源的極大浪費(fèi)。而較新出現(xiàn)的字符緩存(StringBuffer)和字符關(guān)聯(lián)結(jié)構(gòu)(StringBuilder)方式雖然使用緩存來避免過于頻繁地生成新對象,適當(dāng)提升了性能并減少了內(nèi)存空間的浪費(fèi),但現(xiàn)有技術(shù)要么緩存管理不太靈活,要 么過多考慮了其他不常用功能,在單純的字符串存儲和拼接方面的效率和性能仍不太理想。
技術(shù)實(shí)現(xiàn)要素:
基于現(xiàn)有技術(shù)的缺陷,本發(fā)明所要解決的技術(shù)問題是如何最高效地實(shí)現(xiàn)字符串拼接。
根據(jù)本發(fā)明的一個方面,提供了一種字符拼接方法,包括:
根據(jù)獲取的待拼接字符串的長度,確定所述待拼接字符串的拼接空間;
獲得所述拼接空間中的至少一個字符串的長度和/或存儲位置;
根據(jù)所述拼接空間中的至少一個字符串的長度和/或存儲位置,確定所述待拼接字符串在所述拼接空間中的拼接位置;
在所述拼接位置上,將所述待拼接字符串與所述拼接空間中的字符串進(jìn)行拼接。
優(yōu)選地,所述確定所述待拼接字符串的拼接空間包括:
根據(jù)所述待拼接字符串的長度,確定當(dāng)前拼接空間是否需要擴(kuò)容,若需要擴(kuò)容,則將擴(kuò)容的緩存塊添加在當(dāng)前所述拼接空間的最后位置。
優(yōu)選地,所述確定所述待拼接字符串的拼接空間包括:
根據(jù)所述待拼接字符串的長度判斷當(dāng)前拼接空間剩余容量是否足夠,若剩余容量足夠則結(jié)束;
在剩余容量不足時,計(jì)算所述當(dāng)前拼接空間的大??;
根據(jù)所述當(dāng)前拼接空間的大小,創(chuàng)建新的拼接空間;
將所述當(dāng)前拼接空間的數(shù)據(jù)全部填充到所述新的拼接空間中;
將所述新的拼接空間設(shè)置為當(dāng)前拼接空間。
優(yōu)選地,所述獲得所述拼接空間中的至少一個字符串的長度和/或存儲位置包括:在出現(xiàn)冗余時,覆蓋所述冗余的長度和/或剔除所述冗余占用的空間位置。
優(yōu)選地,在所述輸入字符串的長度不大于預(yù)設(shè)長度時,直接將所述待拼 接字符串逐一拼接在所述拼接位置上;在所述輸入字符串的長度大于預(yù)設(shè)長度時,將所述待拼接字符串整串拷貝拼接在所述拼接位置上。
根據(jù)本發(fā)明的另一個方面,還提供了一種字符拼接裝置,包括:
空間管理模塊,用于根據(jù)獲取的待拼接字符串的長度,確定所述待拼接字符串的拼接空間;
位置獲取模塊,用于獲得所述拼接空間中的至少一個字符串的長度和/或存儲位置;以及,
位置確定模塊,用于根據(jù)所述拼接空間中的至少一個字符串的長度和/或存儲位置,確定所述待拼接字符串在所述拼接空間中的拼接位置;
拼接模塊,用于在所述拼接位置上,將所述待拼接字符串與所述拼接空間中的字符串進(jìn)行拼接。
優(yōu)選地,所述空間管理模塊包括:
直接擴(kuò)容模塊,用于根據(jù)所述待拼接字符串的長度,確定當(dāng)前拼接空間是否需要擴(kuò)容,若需要擴(kuò)容,則將擴(kuò)容的緩存塊添加在所述當(dāng)前拼接空間的最后位置。
優(yōu)選地,所述空間管理模塊包括:
容量判斷模塊,用于根據(jù)所述待拼接字符串的長度判斷當(dāng)前拼接空間剩余容量是否足夠,若剩余容量足夠則結(jié)束;
空間大小計(jì)算模塊,用于在剩余容量不足時,計(jì)算所述當(dāng)前拼接空間的大??;
空間創(chuàng)建模塊,用于根據(jù)所述當(dāng)前拼接空間的大小創(chuàng)建新的拼接空間;
數(shù)據(jù)填充模塊,用于將所述當(dāng)前拼接空間的數(shù)據(jù)全部填充到所述新的拼接空間中;
設(shè)置模塊,用于將所述新的拼接空間設(shè)置為當(dāng)前拼接空間。
優(yōu)選地,所述位置確定模塊包括:
冗余處理模塊,用于在出現(xiàn)冗余時,覆蓋所述冗余的長度和/或剔除所述冗余占用的空間位置。
優(yōu)選地,所述拼接模塊包括:
逐一拼接模塊,用于在所述輸入字符串的長度不大于預(yù)設(shè)長度時,直接將所述待拼接字符串逐一拼接在所述拼接位置上;和/或,
整串拼接模塊,用于在所述輸入字符串的長度大于預(yù)設(shè)長度時,將所述待拼接字符串整串拷貝拼接在所述拼接位置上。
本發(fā)明實(shí)施例提供了一種字符拼接方法及裝置,利用簡單高效的緩存區(qū)管理,無需頻繁創(chuàng)建字符串對象,避免了內(nèi)存空間的浪費(fèi);同時其單純關(guān)注于字符串拼接操作,以最高效率完成了操作頻度最高的數(shù)據(jù)處理,實(shí)現(xiàn)了性能最佳的字符串拼接方案。
附圖說明
圖1是本發(fā)明實(shí)施例中字符拼接方法的基本流程示意圖;
圖2是本發(fā)明優(yōu)選實(shí)施例中緩存區(qū)擴(kuò)容方法流程示意圖;
圖3是本發(fā)明實(shí)施例中字符拼接裝置的模塊結(jié)構(gòu)示意圖。
具體實(shí)施方式
為使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚明了,下面結(jié)合具體實(shí)施方式并參照附圖,對本發(fā)明進(jìn)一步詳細(xì)說明。應(yīng)該理解,這些描述只是示例性的,而并非要限制本發(fā)明的范圍。此外,在以下說明中,省略了對公知結(jié)構(gòu)和技術(shù)的描述,以避免不必要地混淆本發(fā)明的概念。
在實(shí)際的軟件編程過程中,字符串拼接是使用頻率最高、處理量最大的數(shù)據(jù)處理類型。但現(xiàn)有技術(shù)的字符串處理方案中,“+”操作符方式處理效率低下且內(nèi)存浪費(fèi)嚴(yán)重,字符緩存(可用StringBuffer表示)和字符關(guān)聯(lián)結(jié)構(gòu)(可用StringBuilder表示)方式則過多考慮了不常用功能,比如寫入、刪除、替換等方法,造成了整體性能的下降。在本發(fā)明實(shí)施例中,利用簡單高效的緩存區(qū)管理,實(shí)現(xiàn)了性能最佳的字符串拼接方案。如圖1所示,本發(fā)明實(shí)施例的字符拼接方法包括:
S1,根據(jù)獲取的待拼接字符串的長度,確定所述待拼接字符串的拼接空間;
S2,獲得所述拼接空間中的至少一個字符串的長度和/或存儲位置;
S3,根據(jù)所述拼接空間中的至少一個字符串的長度和/或存儲位置,確定所述待拼接字符串在所述拼接空間中的拼接位置;
S4,在所述拼接位置上,將所述待拼接字符串與所述拼接空間中的字符串進(jìn)行拼接。
其中,步驟S1中,若待拼接字符串為空或不為字符串形式,則直接結(jié)束該方法。
步驟S2中,根據(jù)待拼接字符串的長度,確定當(dāng)前拼接空間是否需要擴(kuò)容,若需要擴(kuò)容,則將擴(kuò)容的緩存塊添加在當(dāng)前拼接空間的最后位置。
優(yōu)選地,本發(fā)明實(shí)施例采用翻倍拼接空間方式進(jìn)行擴(kuò)容,即擴(kuò)容后當(dāng)前拼接空間大小為擴(kuò)容前的2倍。當(dāng)然為避免造成過多浪費(fèi),每次擴(kuò)容的緩存塊大小也有上限,該上限閾值可采用預(yù)設(shè)的默認(rèn)閾值,也可臨時設(shè)置和/或調(diào)整,默認(rèn)閾值通常為10字(單位W,字長取決于計(jì)算設(shè)備的實(shí)際處理能力);比如在當(dāng)前緩沖區(qū)大于5W時,最多一次也只能擴(kuò)容10W的容量。
在本發(fā)明更優(yōu)選的實(shí)施例中,采用創(chuàng)建全新拼接空間的方式來實(shí)現(xiàn)擴(kuò)容,如圖2所示,拼接空間擴(kuò)容控制方法包括:
S11,根據(jù)字符串的長度判斷當(dāng)前拼接空間剩余容量是否足夠,若剩余容量足夠則結(jié)束;
S12,在剩余容量不足時,計(jì)算當(dāng)前拼接空間的大小;
S13,根據(jù)當(dāng)前拼接空間的大小創(chuàng)建新的拼接空間;
S14,將當(dāng)前拼接空間的數(shù)據(jù)全部填充到新的拼接空間中;
S15,將新的拼接空間設(shè)置為當(dāng)前拼接空間。
因內(nèi)存分配具有隨機(jī)性,當(dāng)前拼接空間之后的空間是否已被分配很難保證,若強(qiáng)制將當(dāng)前拼接空間之后的空間作為擴(kuò)容的緩存塊分配給當(dāng)前拼接空間,很容易引發(fā)內(nèi)存資源沖突,故該優(yōu)選實(shí)施例雖然會浪費(fèi)部分資源卻能保 證數(shù)據(jù)安全和系統(tǒng)的穩(wěn)定性,擴(kuò)容前的拼接空間在適當(dāng)?shù)臅r機(jī)進(jìn)行內(nèi)存回收即可。
步驟S4中,字符串的拼接可采用兩種方式實(shí)現(xiàn):直接按字符逐一拼接附加或?qū)⒆址畯拇酥付ㄎ恢脧?fù)制到Unicode字符數(shù)組中的指定位置,即調(diào)用String.CopyTo方法整字符串拼接附加。
根據(jù)實(shí)際的性能測試,在字符串的長度不大于3時,采用直接賦值的逐一拼接方式性能更高;而長度大于3時,調(diào)用String.CopyTo方法性能更高。
在本發(fā)明優(yōu)選實(shí)施例中,使用一個字符數(shù)組Char[]作為拼接空間的緩存區(qū)(Buff),使用一個位置屬性Position來指示當(dāng)前拼接空間的字符串末尾位置,該位置屬性Position還同時可用于表示當(dāng)前拼接空間中已有字符數(shù)。
步驟S4中,輸入的字符串按照位置屬性(可用Position表示)的指示拼接附加到當(dāng)前拼接空間的字符串末尾。在拼接字符串后,相應(yīng)的位置屬性Position也會對應(yīng)修改后指示拼接后的字符串末尾。
在本發(fā)明另一個優(yōu)選實(shí)施例中,位置屬性Position指示的拼接位置還可以是拼接空間的任意位置,比如在拼接空間中指定的字符串后進(jìn)行拼接,此時根據(jù)該指定的字符串長度和/或存儲位置,確定待拼接字符串的拼接位置。當(dāng)出現(xiàn)冗余時,長度和位置計(jì)算可以是剔除所占空間位置、覆蓋空間內(nèi)字符所占空間的長度。更進(jìn)一步地,拼接位置還可以是首部拼接,即將待拼接字符串插入到首部,此時將待拼接字符串的末尾與拼接空間中字符串首部拼接,位置屬性Position指示的拼接位置為0。
步驟S4中,拼接了輸入字符串后的當(dāng)前拼接空間數(shù)據(jù)實(shí)際已實(shí)現(xiàn)了字符串拼接,此時采用字符串重寫方法將拼接后字符串輸出。
在本發(fā)明優(yōu)選實(shí)施例中,用文本方式存儲字符串,即調(diào)用ToString方法,將當(dāng)前緩沖區(qū)的字符數(shù)組中從0到輸出位置的內(nèi)容轉(zhuǎn)為String對象輸出。
下面給出一個具體的應(yīng)用實(shí)例來說明本發(fā)明實(shí)施例的方法:
假設(shè)用戶分別輸入“ABCD”和“12345”兩個字符串;首先可以確定出“ABCD”的長度為4,“12345”的長度為5。隨后檢查當(dāng)前拼接空間剩余容量是否足夠; 假設(shè)當(dāng)前拼接空間的剩余容量只可以存儲長度為3的字符串,根據(jù)確定出“ABCD”的長度為4、“12345”的長度為5,可以肯定當(dāng)前拼接空間需要擴(kuò)容。按相應(yīng)的方式擴(kuò)容后,將“ABCD”和“12345”分別拼接附加到當(dāng)前拼接空間的末尾;最后,將當(dāng)前拼接空間內(nèi)容輸入,得到拼接后字符串“ABCD12345”(假設(shè)輸入前當(dāng)前拼接空間為空)。
更具體地,本發(fā)明的方法優(yōu)選包裝為一個自定義的快速字符創(chuàng)建類(類名如QuickStringBuilder),編程使用時先構(gòu)建一個QuickStringBuilder對象,拼接操作為字符串添加(Append())方法,比如調(diào)用Append(“abc”),接著又Append(“def”),此時拼接空間已得到拼接內(nèi)容,最后調(diào)用ToString(),則將拼接后結(jié)果“abcdef”返回給用戶。
進(jìn)一步如圖3所示,本發(fā)明實(shí)施例還提供了一種字符拼接裝置1,包括:
空間管理模塊101,用于根據(jù)獲取的待拼接字符串的長度,確定所述待拼接字符串的拼接空間;
位置獲取模塊102,用于獲得所述拼接空間中的至少一個字符串的長度和/或存儲位置;以及,
位置確定模塊103,用于根據(jù)所述拼接空間中的至少一個字符串的長度和/或存儲位置,確定所述待拼接字符串在所述拼接空間中的拼接位置;
拼接模塊104,用于在所述拼接位置上,將所述待拼接字符串與所述拼接空間中的字符串進(jìn)行拼接。
在本發(fā)明優(yōu)選實(shí)施例中,可采用添加緩存塊的直接擴(kuò)容方式管理拼接空間,優(yōu)選地,所述空間管理模塊101包括:
直接擴(kuò)容模塊,用于根據(jù)所述待拼接字符串的長度,確定當(dāng)前拼接空間是否需要擴(kuò)容,若需要擴(kuò)容,則將擴(kuò)容的緩存塊添加在所述當(dāng)前拼接空間的最后位置。
在本發(fā)明另一優(yōu)選實(shí)施例中,還可采用創(chuàng)建新空間的方式管理拼接空間,優(yōu)選地,所述空間管理模塊101包括:
容量判斷模塊,用于根據(jù)所述待拼接字符串的長度判斷當(dāng)前拼接空間剩 余容量是否足夠,若剩余容量足夠則結(jié)束;
空間大小計(jì)算模塊,用于在剩余容量不足時,計(jì)算所述當(dāng)前拼接空間的大小;
空間創(chuàng)建模塊,用于根據(jù)所述當(dāng)前拼接空間的大小創(chuàng)建新的拼接空間;
數(shù)據(jù)填充模塊,用于將所述當(dāng)前拼接空間的數(shù)據(jù)全部填充到所述新的拼接空間中;
設(shè)置模塊,用于將所述新的拼接空間設(shè)置為當(dāng)前拼接空間。
此外,本發(fā)明優(yōu)選實(shí)施例還針對字符串冗余情況進(jìn)行處理,所述位置確定模塊102包括:
冗余處理模塊,用于在出現(xiàn)冗余時,覆蓋所述冗余的長度和/或剔除所述冗余占用的空間位置。
字符串拼接可針對不同情況逐字拼接或整串拼接,優(yōu)選地,所述拼接模塊104包括:
逐一拼接模塊,用于在所述輸入字符串的長度不大于預(yù)設(shè)長度時,直接將所述待拼接字符串逐一拼接在所述拼接位置上;和/或,
整串拼接模塊,用于在所述輸入字符串的長度大于預(yù)設(shè)長度時,將所述待拼接字符串整串拷貝拼接在所述拼接位置上。
本領(lǐng)域相關(guān)技術(shù)人員可以理解,與上述方法一一對應(yīng)地,本發(fā)明實(shí)施例的裝置中也同時存在與各方法步驟相對應(yīng)的各功能模塊,在此不再一一贅述。在實(shí)際應(yīng)用中,上述字符拼接裝置可以是獨(dú)立的計(jì)算設(shè)備,也可以是由計(jì)算設(shè)備加載的獨(dú)立功能單元,還可以是計(jì)算設(shè)備直接實(shí)現(xiàn)的虛擬/實(shí)體單元。同樣,裝置中的各模塊均可由位于計(jì)算設(shè)備中的中央處理器CPU、微處理器MPU、數(shù)字信號處理器DSP或現(xiàn)場可編程門陣列FPGA等實(shí)現(xiàn),本發(fā)明實(shí)施例的裝置及其模塊的實(shí)現(xiàn)手段不應(yīng)視為對本發(fā)明具體實(shí)施方式的限制。
本發(fā)明實(shí)施例提供了一種字符拼接方法及裝置,其可以實(shí)現(xiàn)任意位置的拼接,在拼接空間中確定出可以進(jìn)行拼接的位置,這個拼接位置可以是字符串末尾,也可以是根據(jù)不同需求或應(yīng)用場景插入在中間、首部等;本發(fā)明實(shí) 施例利用簡單高效的緩存區(qū)管理,無需頻繁創(chuàng)建字符串對象,避免了內(nèi)存空間的浪費(fèi);同時其單純關(guān)注于字符串拼接操作,以最高效率完成了操作頻度最高的數(shù)據(jù)處理,實(shí)現(xiàn)了性能最佳的字符串拼接方案。在實(shí)際應(yīng)用中,本發(fā)明實(shí)施例的QuickStringBuilder類僅僅用來代替簡單的字符串“+=”這樣的操作,故只需要實(shí)現(xiàn)Append()方法,其性能優(yōu)于StringBuilder類,根據(jù)實(shí)際性能測試,在計(jì)算設(shè)備配置相對較差的情況下,本發(fā)明實(shí)施例的性能優(yōu)勢更為明顯。
應(yīng)當(dāng)理解的是,本發(fā)明的上述具體實(shí)施方式僅僅用于示例性說明或解釋本發(fā)明的原理,而不構(gòu)成對本發(fā)明的限制。因此,在不偏離本發(fā)明的精神和范圍的情況下所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。此外,本發(fā)明所附權(quán)利要求旨在涵蓋落入所附權(quán)利要求范圍和邊界、或者這種范圍和邊界的等同形式內(nèi)的全部變化和修改例。