java基礎 ---字符和字符串

java基礎   ---字符和字符串

一、char(字符)

在java中,有基本字符類型char和他的封裝類型Character。在java中,所有的基本類型數據都有其相應的封裝類型。比如說,整型int的封裝類型是Integer、雙精度浮點數double的封裝類型是Double等等。

ASCII(American Standard Code for Information Interchange)
是美國對於信息交換的標準代碼,這個種字符碼我們以前在C語言也接觸到過,不過由於它最多隻有255個字符集,而在我們亞洲這種使用的是雙字節字符語言的國家來說,顯然是不夠的,因此Unicode(Unicode Worldwide Character Standard)出現了。

Unicode
Unicode(聯合碼)是一個大字符集,ASCII字符集是它的一個子集。在JAVA中字符都是使用的這種16位的字符集。

在不同的系統或者軟件中也可能採用了不同的編碼字符集,並沒有形成統一,因此在不同的字符編碼環境中使用軟件就會出現亂碼。比較常見的字符集還有:
GBK:大簡體中文字符集
GB2312:簡體中文字符集
Big5:繁體中文字符集
ISO8859_1:微軟瀏覽器中所使用的編碼
UTF-8:這個就是我們的Java中所使用的編碼字符集。

二、String(字符串)
在java中,有兩種字符串類可以使用。String 和 StringBuffer。這兩者的區別在於String類的字符串對象一旦創建了之後就不能再對他進行改變。而當你試圖改變他時,其實只是在堆裏重新又創建了個對象而已,而原來的對象則被遺棄了。(也許他會被垃圾回收器回收,也許永遠也不會,那麼就一直停留在內存裏,佔據內存空間。)比如:
String s = new String("java");
s = s + "language";
看起來好像是將"language"加在原來s所指向字符串的後面,但是其實是又創建了個新的字符串對象,然後s重新指向它。

創建字符串對象除了上面的方式外,還有一種使用字符串常量。
String s = "java";
這種方式建立的字符串對象是程序在被編譯時,編譯器在內存的靜態常量區建立了一個"java"字符串常量。然後定義了一個String類的引用變量指向它。

字符串的比較
== 比較
==比較的是引用變量中的內存地址,比如
String s1 = new String("java");
String s2 = new String("java");
s1 == s2 則返回的結果爲false。因爲此時s1和s2所指向的是不同的地址,因此他們二者是不相等的。這個與對象內具體的值無關。下面我們在看看使用常量字符串時的比較結果:
String s1 = "java";
String s2 = "java";
我們可以看到此時的s1 == s2返回的結果就是true了。這是因爲當第一次"java"這個字符串在內存常量池中建立後,如果在後面又定義了與它相同的字符串常量的話,那麼編譯器會自動將引用都指向同一個常量字符串,這樣可以節省內存空間。現在s1和s2是指向同一個地址,因此他們是相等的。

equals比較
equals能夠比較兩個對象中具體的值是否相等。比如上面的s1和s2就可以用s1.equals(s2)來比較他們裏面的字符串是否相等了,爲true則相等,false不相等。

compareTo比較
s1.compareTo(s2)
用這個方法比較有3種返回值,當s1小於s2時返回負數,如果s1等於s2時,返回0,s1大於s2時,返回正數。

StringBuffer類
剛纔提到,String 類建立的字符串對象中途是不能被改變的,只會不斷的重新創建新的String對象,如果當程序中需要大量操作字符串時,顯然使用String類就會對程序的性能造成很大的影響。因此java又提供了個StringBuffer類,使用它就可以改變其中的字符串而不會重新再創建新的對象。這個類的使用方法基本上和String類很相似。
並且他們之間也可以通過構造器進行相互轉化。他比String 類多了apend()和insert()方法,用於將新的字符串增加或者插入到原來那個字符串中,相當於我們之使用的+號。但是在StringBuffer的對象裏,是不允許使用+號來連接字符串的。只能使用apend()或者insert()方法來添加字符串,其他的還有delete()刪除指定索引號的字符串。

StringBuilder類
這個類和StringBuffer用法是一樣的,只是當使用單線程的時候建議使用StringBuilder,因爲他的執行速度比StringBuffer快。而多線程使用它是不安全的,這時就需要使用StringBuffer。

字符串的分割

今天課堂上,老師給我們佈置了個小練習。據說其他部的一個同學在一次面試時遇到的一個題目。這個題的原型是將一個文件中連續的字符串讀出,然後將他們寫在一個只有2個字段的數據庫中,並且按照第一個字段存儲3個字節,第二個字段存儲5個字節,這樣的規律直到將文件中的字符串全部存儲完。其實這個題最核心的算法就是如何分割字符串這一部分。我們就是只需要將分割這塊通過代碼來完成。下面是代碼的具體實現。

//定義字符串常量
 String str = "123456789abcdefghijklmnopqrstuvwxyz";
 
//循環控制標記。當爲false循環3次,爲true時循環5次,這樣就能夠先分割3個字符,然後分割5個字符。又繼續分割3個字符,依次這樣循環下去。
 boolean flag = false;

 
//當字符串引用變量中沒有字符串,再使用charAt和substring這個方法就會包拋出StringIndexOutOfBoundsException異常,因此需要對他進行異常捕獲。這個也可作爲我們循環結束的條件。
 try{
  
while(true){
   
if(!flag)
   {
    
for(int i = 0;i < 3;i++)
    {
     System.out.print(str.charAt(i));
    }
    System.out.print(
" ");
    flag 
= true;
    
//將提取出來的字符串從原字符串中去掉。
    str = str.substring(3);
   }
   
if(flag)
   {
    
for(int i = 0;i < 5;i++)
    {
     System.out.print(str.charAt(i));
    }
    System.out.print(
" ");
    flag 
= false;
    str 
= str.substring(5);
   }
  }
 }
 
catch(StringIndexOutOfBoundsException e){}

 我們還可以用StringBuffer來做。

StringBuffer str = new StringBuffer(new String("123456789abcdefghijklmnopqrstuvwxyz"));
 
boolean flag = false;

 
try{
  
while(true){
   
if(!flag)
   {
    
for(int i = 0;i < 3;i++)
    {
     System.out.print(str.charAt(i));
    }
    System.out.print(
" ");
    flag 
= true;
    
//這裏稍微有點不同,因爲我們不使用String所以就不能用subString()方法,它返回的是個新的String對象。這裏我們可以使用StringBuffer類的delete()方法,也可以達到同樣的目的,並且這種方式更加高效。
    str.delete(03);
   }
   
if(flag)
   {
    
for(int i = 0;i < 5;i++)
    {
     System.out.print(str.charAt(i));
    }
    System.out.print(
" ");
    flag 
= false;
    str.delete(
05);
   }
  }
 }
 
catch(StringIndexOutOfBoundsException e){}

 

三、正則表達式
正則表達式也是我們非常常用的。當正則表達式用的很熟練的時候,能夠減輕我們的代碼量。比如檢驗用戶輸入的有效性,用正則表達式就非常適用。我用正則表達式的時候還是很多的。無論在什麼地方,只要涉及到對字符串的檢驗,我首先都會考慮到正則表達式,如果實在不行才考慮到if-else。比如在寒假的那個作業中,查詢功能我就是全部用正則表達式來做的,可以很容易的實現數據的模糊查找,這個是if-else很難辦到的,即使能夠那也是要付出相當高的代價。還有比如電子郵件等等,用正則表達式也是非常輕鬆就可以實現的。

正則表達式常用的有兩種寫法。一個是通過String類中的matches()方法,第二個通過util包中Pattern這個類來建立正則表達式對象,兩個方法效果是一樣的。比如:
//下面正則表達式是檢查電子郵件的有效性
private static final String PATTERN = "//S*//w+@[0-9A-Za-z]+//.//w+[//w//.]*[0-9a-zA-Z]+"
str.matches(PATTERN);
//第二種用法
Pattern pat = Pattern.compile(PATTERN);
Matcher mat = pat.matcher(str);
boolean b = mat.matches();
//我們還可以寫成
boolean b = Pattern.matches(PATTERN,str);

在java中要使用雙斜槓來代表轉義符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章