程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 深刻解析C++和JAVA的字符串

深刻解析C++和JAVA的字符串

編輯:關於C++

深刻解析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都是年夜同小異的。

以上就是本文的全體內容,願望對年夜家的進修有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved