深刻解析C++和JAVA的字符串。本站提示廣大學習愛好者:(深刻解析C++和JAVA的字符串)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻解析C++和JAVA的字符串正文
一切的字符串類都來源於C說話的字符串,而C說話字符串則是字符的數組。C說話中是沒有字符串的,只要字符數組。
談一下C++的字符串:C++供給兩種字符串的表現:C作風的字符串和尺度C++引入的string類型。普通建議用string類型,然則現實情形中照樣要應用老式C作風的字符串。
1.C作風的字符串:C作風字符串來源於C,並在C++中獲得擴大。字符串存儲在一個字符數組中,例如:
const char *str = “zhangdan”;(不要忘失落最初的\0)
這裡用常量字符數組來表現字符串。操作字符串的時刻只需操作指針便可以了。如 :
const char * str = "zhangdan"; const char *p = str; 然後對p停止操作便可以了。
2.尺度C++的string類型:假如用的話起首要引入頭文件:#include<string>
在C++中供給的尺度字符串類型供給了以下操作:
(1).支撐用字符序列或許第二個字符串去初始化一個字符串對象。C作風的字符串不支撐用別的一個字符串初始化別的一個字符串。
(2).支撐字符串之間的copy,C作風字符通同過strcpy()函數來完成。
(3).支撐讀寫拜訪單個字符。關於C作風的字符串,只要消除援用或許經由過程下標操作能力拜訪單個字符。
(4).支撐兩個字符串相等比擬,關於C作風的字符串,比擬是經由過程strcmp()函數來完成的。
(5).支撐兩個字符串聯接,關於C作風的字符串用strcpy() 函數copy到一個新的實例中,然後用strcat()把兩個字符串接起來。如:
string str1 = "111111", str2 = "222222";
string str3 = str1 + str2;
(6).支撐對字符串長度的查詢:string s ("XXXXXXX"); str.size() 為字符串的長度。
互相轉換:const char * str = str2.c_str(); //弗成把字符串類型直接賦給字符數組,然則可以吧一個字符數組賦給一個字符串類型:如:const char *str = "zhangdan"; string str2 = str;
C++ string類的輸出
(1)辦法一:和C字符串輸出的辦法一雷同。
(2)辦法二:應用getline函數。
例如:string a;
getline(cin,a);
字符串到數字的轉換
atoi函數獲得一個C字符串參數,前往對應的int值。假如參數不與一個int值對應,atoi就會前往0。atoi函數在文件為cstdlib的庫中。假如數字太年夜,不克不及轉換成int類型的值,可使用atol將字符串轉換為long類型的值。
例如:
atoi("1234"); //前往整數1234
atoi("#123"); //前往0
C++中字符串的經常使用辦法就紛歧一引見,引見幾個經常使用的:begin(),end(),append(),等等。
2:JAVA中的字符串:在JAVA中,String不屬於8中根本類型,所以String是對象,默許值是null
例如:String str = new String(); 和String str = new String("");是一個意思,就是結構一個空字符串,(懂得null和""的差別)。
看上面這段代碼:
String str = "xxx"; String str2 = new String("xxx"); System.out.println(str == str2); System.out.println(str.equals(str2));
成果是:
false
true
為何呢? 在JAVA中 == 是對地址的比擬,而equals是對內容的比擬,為何地址紛歧樣呢?
先引入常量池的概念:
常量池(constant pool)指的是在編譯期被肯定,並被保留在已編譯的.class文件中的一些數據。它包含了關於類、辦法、接口等中的常量,也包含字符串常量。
當我們將一個字符串賦給一個字符串變量的時刻,如String str = "xxxx"; 這時候候,先去常量池中找有無"xxxx"的字符串拷貝,假如有的話,把str的地址指向常量池中字符串常量"xxxx"的地址,假如沒有則在常量池中樹立"xxxx"的字符串常量。而 new String("xxxx")是放在堆內存中,有本身的內存空間。所以地址比擬的時刻紛歧樣。
看上面一段代碼:
String str = "zhang"; String str2 = "peng"; String str3 = "zhangpeng"; String str4 = "zhangpeng" str += str2; System.out.println(str == str3); System.out.println(str3 == str4)
成果為:
true
true
為何呢?
起首,我們要曉得Java會確保一個字符串常量只要一個拷貝。
由於例子中的str3和str4中的"zhangpeng"都是字符串常量,它們在編譯期就被肯定了,所以str3==str4為true;而"zhang"和"peng"也都是字符串常量,當一個字符串由多個字符串常量銜接而成時,它本身確定也是字符串常量,所以str2也異樣在編譯期就被解析為一個字符串常量,所以str2也是常量池中"zhangpeng"的一個援用。
JAVA 中String 和StringBuffer的差別:
String:
是對象不是原始類型.
為弗成變對象,一旦被創立,就不克不及修正它的值.
關於曾經存在的String對象的修正都是從新創立一個新的對象,然後把新的值保留出來.
String 是final類,即不克不及被繼續.
StringBuffer:
是一個可變對象,當對他停止修正的時刻不會像String那樣從新樹立對象
它只能經由過程結構函數來樹立,
StringBuffer sb = new StringBuffer();
不克不及經由過程付值符號對他停止付值.
sb = "xxxxx";
對象被樹立今後,在內存中就會分派內存空間,並初始保留一個null.向StringBuffer
中付值的時刻可以經由過程它的append辦法.
sb.append("hello");
字符串聯接操作中StringBuffer的效力要比String高:
String str = new String("xxx");
str += "xx";
的處置步調現實上是經由過程樹立一個StringBuffer,然後挪用append(),最初
再將StringBuffer toSting();
如許的話String的銜接操作就比StringBuffer多出了一些附加操作,所以就慢了
問一個成績:為何StringBuffer效力這麼高,那末我們還要String呢?
不會的查一下吧,偏向是常量池。
Python 字符串:
Python是一種壯大的劇本說話,它界說字符串的時刻不消界說類型。python字符通同常有單引號('...')、雙引號("...")、三引號("""...""")或('''...''')包抄,三引號包括的字符串可由多行構成,普通可表現年夜段的論述性字符串。在應用時根本沒有差異,但雙引號和三引號("""...""")中可以包括單引號,三引號 ('''...''')可以包括雙引號,而不須要本義。當須要特別本義的時刻可以用 '\'
python 也有許多字符串操作的函數。詳細可以dir一把,跟C++和java都是年夜同小異的。
以上就是本文的全體內容,願望對年夜家的進修有所贊助。