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

剖析C++和JAVA的字符串

編輯:關於C語言

       所有的字符串類都起源於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和""的區別)。

        看下面這段代碼:

 

  1. String str = "xxx";  
  2. String str2 = new String("xxx");
  3. System.out.println(str == str2);
  4. System.out.println(str.equals(str2)); 

結果是:

false

true

為什麼呢? 在JAVA中 == 是對地址的比較,而equals是對內容的比較,為什麼地址不一樣呢?

先引入常量池的概念:
常量池(constant pool)指的是在編譯期被確定,並被保存在已編譯的.class文件中的一些數據。它包括了關於類、方法、接口等中的常量,也包括字符串常量。

當我們將一個字符串賦給一個字符串變量的時候,如String str = "xxxx"; 這時候,先去常量池中找有沒有"xxxx"的字符串拷貝,如果有的話,把str的地址指向常量池中字符串常量"xxxx"的地址,如果沒有則在常量池中建立"xxxx"的字符串常量。而 new String("xxxx")是放在堆內存中,有自己的內存空間。所以地址比較的時候不一樣。

看下面一段代碼:
 

  1. String str = "zhang";  
  2. String str2 = "peng";  
  3. String str3 = "zhangpeng";
  4. String str4 = "zhangpeng" 
  5. str += str2;  
  6. System.out.println(str == str3); 
  7. 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都是大同小異的。

 

本文出自 “深巷明朝賣杏花” 博客,請務必保留此出處http://padden.blog.51cto.com/2514314/489043

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