深入解析C++和JAVA的字符串
所有的字符串類都起源于C語(yǔ)言的字符串,而C語(yǔ)言字符串則是字符的數(shù)組。C語(yǔ)言中是沒(méi)有字符串的,只有字符數(shù)組。
談一下C++的字符串:C++提供兩種字符串的表示:C風(fēng)格的字符串和標(biāo)準(zhǔn)C++引入的string類型。一般建議用string類型,但是實(shí)際情況中還是要使用老式C風(fēng)格的字符串。
1.C風(fēng)格的字符串:C風(fēng)格字符串起源于C,并在C++中得到擴(kuò)展。字符串存儲(chǔ)在一個(gè)字符數(shù)組中,例如:
const char *str = “zhangdan”;(不要忘掉最后的\0)
這里用常量字符數(shù)組來(lái)表示字符串。操作字符串的時(shí)候只要操作指針就可以了。如 :
const char * str = "zhangdan"; const char *p = str; 然后對(duì)p進(jìn)行操作就可以了。
2.標(biāo)準(zhǔn)C++的string類型:如果用的話首先要引入頭文件:#include<string>
在C++中提供的標(biāo)準(zhǔn)字符串類型提供了以下操作:
(1).支持用字符序列或者第二個(gè)字符串去初始化一個(gè)字符串對(duì)象。C風(fēng)格的字符串不支持用另外一個(gè)字符串初始化另外一個(gè)字符串。
(2).支持字符串之間的copy,C風(fēng)格字符串通過(guò)strcpy()函數(shù)來(lái)實(shí)現(xiàn)。
(3).支持讀寫訪問(wèn)單個(gè)字符。對(duì)于C風(fēng)格的字符串,只有解除引用或者通過(guò)下標(biāo)操作才能訪問(wèn)單個(gè)字符。
(4).支持兩個(gè)字符串相等比較,對(duì)于C風(fēng)格的字符串,比較是通過(guò)strcmp()函數(shù)來(lái)實(shí)現(xiàn)的。
(5).支持兩個(gè)字符串連接,對(duì)于C風(fēng)格的字符串用strcpy() 函數(shù)copy到一個(gè)新的實(shí)例中,然后用strcat()把兩個(gè)字符串接起來(lái)。如:
string str1 = "111111", str2 = "222222";
string str3 = str1 + str2;
(6).支持對(duì)字符串長(zhǎng)度的查詢:string s ("XXXXXXX"); str.size() 為字符串的長(zhǎng)度。
相互轉(zhuǎn)換:const char * str = str2.c_str(); //不可把字符串類型直接賦給字符數(shù)組,但是可以吧一個(gè)字符數(shù)組賦給一個(gè)字符串類型:如:const char *str = "zhangdan"; string str2 = str;
C++ string類的輸入
(1)方法一:和C字符串輸入的方法一相同。
(2)方法二:使用getline函數(shù)。
例如:string a;
getline(cin,a);
字符串到數(shù)字的轉(zhuǎn)換
atoi函數(shù)獲取一個(gè)C字符串參數(shù),返回對(duì)應(yīng)的int值。如果參數(shù)不與一個(gè)int值對(duì)應(yīng),atoi就會(huì)返回0。atoi函數(shù)在文件為cstdlib的庫(kù)中。如果數(shù)字太大,不能轉(zhuǎn)換成int類型的值,可以使用atol將字符串轉(zhuǎn)換為long類型的值。
例如:
atoi("1234"); //返回整數(shù)1234
atoi("#123"); //返回0
C++中字符串的常用方法就不一一介紹,介紹幾個(gè)常用的:begin(),end(),append(),等等。
2:JAVA中的字符串:在JAVA中,String不屬于8中基本類型,所以String是對(duì)象,默認(rèn)值是null
例如:String str = new String(); 和String str = new String("");是一個(gè)意思,就是構(gòu)造一個(gè)空字符串,(理解null和""的區(qū)別)。
看下面這段代碼:
String str = "xxx"; String str2 = new String("xxx"); System.out.println(str == str2); System.out.println(str.equals(str2));
結(jié)果是:
false
true
為什么呢? 在JAVA中 == 是對(duì)地址的比較,而equals是對(duì)內(nèi)容的比較,為什么地址不一樣呢?
先引入常量池的概念:
常量池(constant pool)指的是在編譯期被確定,并被保存在已編譯的.class文件中的一些數(shù)據(jù)。它包括了關(guān)于類、方法、接口等中的常量,也包括字符串常量。
當(dāng)我們將一個(gè)字符串賦給一個(gè)字符串變量的時(shí)候,如String str = "xxxx"; 這時(shí)候,先去常量池中找有沒(méi)有"xxxx"的字符串拷貝,如果有的話,把str的地址指向常量池中字符串常量"xxxx"的地址,如果沒(méi)有則在常量池中建立"xxxx"的字符串常量。而 new String("xxxx")是放在堆內(nèi)存中,有自己的內(nèi)存空間。所以地址比較的時(shí)候不一樣。
看下面一段代碼:
String str = "zhang"; String str2 = "peng"; String str3 = "zhangpeng"; String str4 = "zhangpeng" str += str2; System.out.println(str == str3); System.out.println(str3 == str4)
結(jié)果為:
true
true
為什么呢?
首先,我們要知道Java會(huì)確保一個(gè)字符串常量只有一個(gè)拷貝。
因?yàn)槔又械膕tr3和str4中的"zhangpeng"都是字符串常量,它們?cè)诰幾g期就被確定了,所以str3==str4為true;而"zhang"和"peng"也都是字符串常量,當(dāng)一個(gè)字符串由多個(gè)字符串常量連接而成時(shí),它自己肯定也是字符串常量,所以str2也同樣在編譯期就被解析為一個(gè)字符串常量,所以str2也是常量池中"zhangpeng"的一個(gè)引用。
JAVA 中String 和StringBuffer的區(qū)別:
String:
是對(duì)象不是原始類型.
為不可變對(duì)象,一旦被創(chuàng)建,就不能修改它的值.
對(duì)于已經(jīng)存在的String對(duì)象的修改都是重新創(chuàng)建一個(gè)新的對(duì)象,然后把新的值保存進(jìn)去.
String 是final類,即不能被繼承.
StringBuffer:
是一個(gè)可變對(duì)象,當(dāng)對(duì)他進(jìn)行修改的時(shí)候不會(huì)像String那樣重新建立對(duì)象
它只能通過(guò)構(gòu)造函數(shù)來(lái)建立,
StringBuffer sb = new StringBuffer();
不能通過(guò)付值符號(hào)對(duì)他進(jìn)行付值.
sb = "xxxxx";
對(duì)象被建立以后,在內(nèi)存中就會(huì)分配內(nèi)存空間,并初始保存一個(gè)null.向StringBuffer
中付值的時(shí)候可以通過(guò)它的append方法.
sb.append("hello");
字符串連接操作中StringBuffer的效率要比String高:
String str = new String("xxx");
str += "xx";
的處理步驟實(shí)際上是通過(guò)建立一個(gè)StringBuffer,然后調(diào)用append(),最后
再將StringBuffer toSting();
這樣的話String的連接操作就比StringBuffer多出了一些附加操作,所以就慢了
問(wèn)一個(gè)問(wèn)題:為什么StringBuffer效率這么高,那么我們還要String呢?
不會(huì)的查一下吧,方向是常量池。
Python 字符串:
Python是一種強(qiáng)大的腳本語(yǔ)言,它定義字符串的時(shí)候不用定義類型。python字符串通常有單引號(hào)('...')、雙引號(hào)("...")、三引號(hào)("""...""")或('''...''')包圍,三引號(hào)包含的字符串可由多行組成,一般可表示大段的敘述性字符串。在使用時(shí)基本沒(méi)有差別,但雙引號(hào)和三引號(hào)("""...""")中可以包含單引號(hào),三引號(hào) ('''...''')可以包含雙引號(hào),而不需要轉(zhuǎn)義。當(dāng)需要特殊轉(zhuǎn)義的時(shí)候可以用 '\'
python 也有很多字符串操作的函數(shù)。具體可以dir一把,跟C++和java都是大同小異的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- Java生成和解析XML格式文件和字符串的實(shí)例代碼
- java解析任意層數(shù)json字符串的方法
- java統(tǒng)計(jì)字符串單詞個(gè)數(shù)的方法解析
- java解析出url請(qǐng)求的路徑和參數(shù)鍵值對(duì)類(解析出url請(qǐng)求的路徑,包括頁(yè)面)
- 深入解析Java編程中方法的參數(shù)傳遞
- 解析Java的可變長(zhǎng)參數(shù)列表及其使用時(shí)的注意點(diǎn)
- 在java中使用dom4j解析xml(示例代碼)
- java對(duì)XML文件的解析、節(jié)點(diǎn)的增加、刪除操作總結(jié)
- java中字符串參數(shù)化符號(hào)${}的解析
相關(guān)文章
C++ leetcode之刪除并獲得點(diǎn)數(shù)的示例代碼
這篇文章主要介紹了C++ leetcode之刪除并獲得點(diǎn)數(shù)的示例代碼,本文給大家分享問(wèn)題解析及解決方案,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05C++無(wú)符號(hào)整數(shù)溢出問(wèn)題解析
這篇文章主要介紹了C++無(wú)符號(hào)整數(shù)溢出探究,本文主要探討C/C++中無(wú)符號(hào)整數(shù)超過(guò)范圍后的計(jì)算問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06VSCode 配置C++開(kāi)發(fā)環(huán)境的方法步驟
這篇文章主要介紹了VSCode 配置C++開(kāi)發(fā)環(huán)境的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Qt?10進(jìn)制和16進(jìn)制轉(zhuǎn)換的使用示例
在編程過(guò)程中,處理16進(jìn)制字符串與10進(jìn)制數(shù)字之間的轉(zhuǎn)換是很常見(jiàn)的需求,本文主要介紹了Qt?10進(jìn)制和16進(jìn)制轉(zhuǎn)換的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09