回覆列表
-
1 # 使用者8852944140293
-
2 # 使用者2069460986578
字串是由字元組成的,多個字元以0結尾組成一個字串,字串需要給出首字元位置
數字,如果是用於輸入輸出的,是由數字字元組成,數字字元組成的數字並不能直接用於計算,而需要取出真實的值才行,比如:字串"123"只是數字,要想得到可用於計算的123,可以:a=("1"-"0")*100+("2"-"0")*10+("3"-"0");得到,數值要輸出顯示,也要轉換成字元組成的數字:printf("%d\n",a);
字串的定義是:字串
字串時程式設計中經常要使用到的資料結構。它是字元的序列,從某種程度上來說有些類似於字元的陣列。在java這個面向物件的語言中,字串,無論是常量還是變數,都是用類的物件來實現的。
程式中需要用到的字串可以分為兩大類:
(1)、一類時建立之後不再做修改和變動的字串常量;
(2)、另一類時建立之後允許再做修改和變化的字串變數。
對於字串常量,由於程式中經常需要對它做比較、搜尋之類的操作,所以通常把它放在一個具有一定名稱的物件之中,由程式對該物件完成上述操作。在java中,存放字串常量的物件屬於String類。對於字串變數,由於程式中經常需要對它做新增、插入、修改之類的操作,所以一般都存放在StringBuffer類的物件中。
1 String類
字串常量用String類的物件表示。在前面的程式中,以多次使用了字串常量。這裡首先強調一下字串常量與字元常量不同。字元常量是用單引號括起的單個字元,例如’a’,’\n’等。而字串常量是用雙引號括起的字元序列,例如”a”,”\n”,”Hellow ”等。Java中的字串常量,表面上與其他語言中的字串常量沒有什麼不同,但在具體實現上卻有較大的差異。Java的字串常量,通常是作為String類的物件存在,由專門的屬性來規定它的長度。實際上,對於所有用雙引號括起的字串常量,系統會把它建立一個無名的String型別物件。
(1)、建立字串常量string物件
由於string類的物件表示的是字串常量,所以一般情況下,一個String字串一經建立,無論其長度還是其內容,都不能夠再更改了。因而,在建立String物件時,通常需要向String類的建構函式傳遞引數來指定所建立的字串內容。下面簡單列出string類的建構函式及其使用方法。
(1)pulic String()
這個建構函式用來建立一個空的字串常量。
(2)public String(String value)
這個建構函式利用一個已經存在的字串常量建立一個新的String物件,該物件的內容與給出的字串常量一致。這個字串常量可以是另一個String物件,也可以是一個用雙引號括起來的直接常量。
(3)public string(stringBuffer buffer)
這個建構函式利用已經存在的字元陣列的內容初始化新建的String物件。
建立string物件與建立其他類的物件一樣,分為物件的宣告和物件的建立兩步。這兩步可以分成兩個獨立的語句,也可以在下一個語句中完成。
例如下面的句子僅宣告一個String物件s:
String s;
此時s的值為null,要想使用s ,還必須為它開闢記憶體空間。
String s=new String ("ABC");
這樣,透過呼叫上面的第二個建構函式,字串s被置為"ABC"。上述兩個語句也可以合併成一個語句如下:
String s=new String ("ABC");
在java中,還有一種非常特殊而常用的建立String物件的方法。這種方法直接利用雙引號括起來的字串常量為新的String物件“賦值”:
String s="ABC";
其實這裡的“賦值”只是一種特殊的省略寫法,前面已經提到,java系統會自動為每一用雙引號括起來的字串常量建立一個String物件,所以這個語句的實際含義與效果與前一個句子完全一致。
2、字串產量的操作
String類中所包含的字串常量的操作很多,如:求字串的長度。具體方法如下:
public int length();
用它可以獲得當前字串物件中字元的個數。例如執行下面的程式碼:
String s="Hello!"
System.out.println(s.length());
螢幕將顯示6,因為字串"Hello!"的長度為6。需要注意的是在java中,因為每個字元都是佔用16個位元的Unicode字元,所以漢字與英文或其他符號相同,也只用一個字元表示就足夠了。如果把上面的字串替換為“近來身體好嗎”,則字串的長度不變,仍然是6。
3、判斷字串的字首和字尾
public boolean startsWith(String prefix);
public boolean endsWith(String prefix);
這兩個方法可以分別判斷當前字串的字首和字尾是否是字元子串。
區分字串的字首及字尾在某些情況下是非常有用的操作。
又例如,居民身份證號碼的最後一位代表了居民的性別,奇數為男性,偶數為女性。假設String物件s是某位居民的身份證號碼,則下面語句將判斷出它的性別:
if(s.endsWith("0")||s.endsWith("2")||s.endsWith("4")||s.endsWith("6")||s.endsWith("8"))
{ System.out.println("此人是女性");
}
startWith和endWith這兩個方法的一個突出優點是不限制所判斷的字首、字尾的長度。例如前一個例子中若需判斷的字首從“6278”變換到“627”,則原方法仍然有效,不需要更改程式。
4、字串中單個字元的查詢
public int indexOf(int ch);
public int indexOf(int ch,int fromIndex);
上述兩個方法查詢當前字串中某個特定字元出現的位置。第一個方法查詢字元ch在當前字串中的一次出現的位置,即從頭向後查詢,並返回字元ch出現的位置。如果找不到則返回-1。例如下面的語句將把值0賦給整型量idx:
String s="java是面向物件的語言,javaScript是指令碼語言";
int idx=s.indexOf((int)"J");
第二個方法查詢字元ch時,在當前字串中自fromIndex位字元之後向後查詢,並返回該字元首次出現的位置。下面語句將查詢處指定字元在字串中的所有出現位置:
String s="java是面向物件的語言,javaScript是指令碼語言";
int i=-1;
do{
i=s.indexOf((int)"a",i++);
system.out.print(i+"\t");
}while(i!=-1);
執行結果是:1 3 14 16 -1
下面的兩個方法也是查詢字串中單個字元的方法,不同的是它們從字串的結尾向字串的開始部分查詢,這裡就不再舉例了。
public int lastIndexOf(int ch);
public int lastIndexOf(int ch,int fromIndex);
5、字串中子串的查詢
public int indexOf(string str);
public int indexOf(string str,int fromIndex);
public int lastIndexOf(string str);
public int lastIndexOf(string str,int fromIndex);
在字串中查詢字元子串與在字串中查詢單個字元非常相似,也有四種可供選擇的方法,它就是把查詢單個字元的四個方法中指定的字元ch換成了指定字串str。下面的例子從字串尾部向前,順序查詢所有子串出現的位置:
String s="java是面向物件的語言,javaScript是指令碼語言";
String sub="語言";
for (int i=s.length();i!=-1){
i=s.lastIndexOf(sub,i-1);
system.out.print(i+"\t");
}
上述程式執行的結果是:26 10 -1
另外,還定義有獲取字串中的某個字元的方法:
public char charAt(int index);
這個方法獲取當前字串第index個字元並返回這個字元(index從0算起)。
6、比較兩個字串
public int conpareTo(string anotherString);
public boolean equals(Object anObject);
public boolean equalsIgnoreCase(string anotherString);
String類中有三個方法可以比較兩個字串是否相同。方法equals是過載Object類的方法,它將當前字串與方法的引數列表中給出的字串鄉比較,若兩字串相同,則返回其真值,否則返回假值。方法equalsIgnoreCase與方法equals的用法相似,只是它比較字串時不計字母大小寫的差別。
例如,在下面的語句中,分別用equals方法和equalsIgnoreCase方法比較兩字串,則在第一語句中由於區分大小寫,所以比較結果為假,而在第二個語句中由於不區分大小寫,所以比較結果為真:
string s1="Hello!World"; s2="hello!world";
boolean b1=s1.equals(s2);
boolean b2=s1.equalsIgnoreCase(s2);
比較字串的另一個方法是compareTo(),這個方法將當前字串與一個引數字串鄉比較,並返回一個整型量。如果當前字串與引數字串完全相同,則compareTo()方法返回0;如果當前字串按字母序大與引數字串,則compareTo()方法返回一個大於0的整數;反之,若compareTo()方法返回一個小於0的整數,則說明當前字串按字母序小與引數字串。
在下面的例子中,compareTo比較了三對字串。
String s="abc",s1="aab",s2="abd",s3="abc";
int i,j,k;
i=s.compareTo(s1);
j=s.compareTo(s2);
k=s.compareTo(s3);
語句執行的結果是分別給i,j,k三個變數賦值1,-1,0。
7、連線字元子串
public String concat(String str);
這個方法將引數字串連線在當前字串的尾部,並返回這個連線而成的長字串,但是當前字串本身並不改變。如下面的例子:
String s="Hello!";
System.out.println(s.concat("World!"));
System.out.println(s);
執行結果是:
Hello!World! //連線後的新字串
Hello! //原字串沒有改變
2 StringBuffer
java中用來實現字串的另一個類是 StringBuffer類,與實現字串常量的String類不同,StringBuffer類的物件可以擴充和修改的字串變數。
(1)、建立字串變數-- StringBuffer物件
由於 StringBuffer表示的事可擴充、修改的字串,所以在建立 StringBuffer類的物件時並不一定要給出初值。 StringBuffer
類的建構函式有以下幾個:
public StringBuffer();
public StringBuffer(int length);
public StringBuffer(String str);
第一個函式建立了一個空的 StringBuffer物件。第二個函式給出了新建的 StringBuffer物件的長度,第三個函式利用一個已經存在的字串String物件來初始化StringBuffer物件。
下面語句是用三種不同的方法建立字串的例子。
StringBuffer MyStrBuff1=new StringBuffer();
StringBuffer MyStrBuff2=new StringBuffer(5);
StringBuffer MyStrBuff3=new StringBuffer("Hello,Guys!");
需要注意的是,其中第一個物件MyStrBuff1並沒有相應的記憶體單元,需擴充之後才能使用。
(2)、字串變數的擴充、修改與操作
StringBuffer類有兩組用來擴充其中所包含的字元的方法,分別是:
public StringBuffer append(引數物件型別 引數物件名);
public StringBuffer insert(int 插入位置,引數物件型別 引數物件名);
append方法將指定的引數物件轉化成字串,附加在StringBuffer字串之後,而insert方法則在指定的位置插入給出的引數物件所轉化而得的字串。附加或插入的引數物件可以使各種資料型別的資料,如int,double,char,String等。參看下面的例子:
StringBuffer MyStrBuff1=new StringBuffer();
MyStrBuff1 append("Hello,Guys!");
System.out.println(MyStrBuff1.toString());
MyStrBuff1.insert(6,30);
System.out.println(MyStrBuff1.toString());
上述執行的結果是:
Hello,Guys!
Hello,30 Guys!
需要注意的是,若希望StringBuffer在螢幕上顯示出來,則必須首先呼叫toString方法把它變成字串常量,因為PrintStream的方法println()不接受StringBuffer型別的引數。
StringBuffer還有一個較有用的方法來修改字串:
public void setCharAt(int index,char ch);
這個方法可以將指定位置的字元用給定的另一個字元來替換。例如下面的語句將願意為“山羊”的字串變成“外套”:
StringBuffer MyStrBuff=new StringBuffer("goat");
MyBuff.setCharAt(0,"c");
(3)、字串的賦值和加法
字串是經常使用的資料型別,為了程式設計方便,java編譯系統中引入了字串的加法和賦值。
參看下面的例子:
String MyStr="Hello,";
MyStr=MyStr+"Guys!";
這兩個語句出看似乎有問題,因為String是可變的字串常量,實際上它們是合乎語法規定的,分別相當於:
String MyStr=new StringBuffer().append("Hello").toString();
MyStr=new StringBuffer().append(MyStr).append("Guys!").toString();
由於這種賦值和加法的簡便寫法非常方便實用,所以在實際程式設計中用的很多。
3 Java Application命令列引數
Java Application是用命令列來啟動的,命令列引數就成為向Java Application傳入資料的常用而有效的手段。現透過下例來考察如何使用命令列引數。
見例程UseComLParameter.java
該例的功能是從命令列利用命令列引數讀入兩個整數,再把它們相乘後輸出。假設將上述程式儲存為一個 UseComLParameter.java檔案,經編譯後生成 UseComLParameter.class檔案,則執行這個程式的命令列應該是如下格式:
java UseComLParameter 52 -4
這裡,java是用來執行位元組碼的java直譯器,UseComLParameter是所執行的位元組碼檔名(即所執行的類名),52和-4分別是兩個命令列引數。
可以看出,java的命令列引數跟在命令列主類名的後面,引數之間用空格分隔。如果命令列引數本身就帶有空格,則可以用雙引號將整個引數括起來以示區別,例如“a dog”就是一個完整的命令列引數。
Java Application程式中用來接受命令列引數的資料結構的是main()方法的引數args[],這個引數是一個字串陣列,其中的每個元素都是一個字串,這些字串來自於使用者與類名同時輸入的命令列引數,每個字串儲存一個命令列引數供程式使用,使用者輸入了幾個命令列引數,陣列args[]就有幾個元素。另外需要注意的是,所有命令列引數都以字串String型別的物件形式存在,如果希望把引數作為其他型別的資料使用,則還需要作相應的型別轉換。
可見,命令列引數是提供該整個程式的引數,每次執行時使用不同的命令列引數,就有不同的執行結果;使用命令列引數可以提高程式的靈活性和適應性。不過在使用命令列引數時要注意陣列越界問題,程式執行是系統將自動檢查使用者輸入了多少個命令列引數並逐個地儲存在args[]中,但是如果程式不檢查使用者到底數入了多少個命令列引數而直接訪問args[]某下標地陣列元素,則可能造成陣列越界異常。