天天看點

String

<b>String</b><b>的比較問題:</b>

       · String是一個系統提供好的類,但是String可以像基本資料類型那樣,直接指派

       · String還可以通過new關鍵字指派

public class OODemo12{

         public static void main(String args[]){

                   String str1 = "abc" ;

                   String str2 = new String("abc") ;

                   String str3 = str2 ;

         }

};

那麼該如何去比較兩個字元串是否相等呢?

· 按照“==”的方式進行比較

                   System.out.println(str1==str2) ;    // false

                   System.out.println(str1==str3) ;    // false

                   System.out.println(str3==str2) ;    // true

       比較之後發現,雖然str1和str2的内容是一樣,但是通過==比較之後,結果均為“false”,而str2和str3的比較結果均為“true”。

       如果使用了“==”,則最終的比較結果是比較的兩個位址。

· 最終應該比較的是兩個字元串的内容,是以此時,就必須使用String類中提供好的一個方法:

       public boolean equals(String str)

public class OODemo13{

                   System.out.println(str1.equals(str2)) ;    // true

                   System.out.println(str1.equals(str3)) ;    // true

                   System.out.println(str3.equals(str2)) ;    // true

使用equals方法比較的是兩個字元串的内容。

<b>注意點1</b><b>:</b>

       實際上一個字元串就是String類的匿名對象。

       每一個字元串都會在堆記憶體中開辟空間。

              String str1 = "abc" ;

       · 首先要在堆記憶體中開辟一個空間,此空間存放的是“abc”的字元串,之後把此字元串的位址使用給了str1:System.out.println("abc".equals(str2)) ;

<b>注意點2</b><b>:</b>

       String有兩種執行個體化方式

       · 直接指派

       · 使用new關鍵字開辟

       以上兩種方式使用那種更好呢?

       · 直接指派:它本身隻會産生一個執行個體化對象

public class OODemo14{

       · 使用new關鍵字開辟,會産生兩個執行個體化對象

                   String str1 = new String("abc") ;

使用直接指派的方式比較節約空間,是以絕對不要使用new關鍵字執行個體化對象。

<b>注意點3</b><b>:</b>

       · String中的内容一旦聲明則不可改變

       String的内容是固定的,如果要改變其内容,修改的是其記憶體的指向。

                   str1 += "bcd" ;

                   System.out.println(str1) ;

<b>注意點4</b><b>:</b>

       對于一個字元串而言,在JAVA中屬于共享設計模式的應用,即:如果一個字元串已經被另外一個字元串所引用,則以後如果聲明的字元串内容相同,則不會再重新聲明。

public class OODemo15{

                   String str2 = "abc" ;

                   System.out.println(str1==str2) ;

<b>注意點5</b><b>:</b>

       以下的程式代碼絕對不要出現,出現之後會影響系統的性能。

public class OODemo28{

                   String str1 = "a" ;

                   for(int i=0;i&lt;100;i++){

                            str1 += i ;

                   }

       如果按以上的形式編寫代碼,則String的記憶體指向(斷開和重新連接配接)需要進行100次,性能肯定低。是以此種語句在開發中絕對不允許出現。

實際上String類還存在着大量的系統提供好的方法

1、  取得字元串長度的方法

       public int length()   à 取出字元串的長度

public class OODemo16{

                   String str1 = "abcfdafdsadafsdfdssdfa" ;

                   System.out.println(str1.length()) ;

2、  将字元串變為一個字元數組

public class OODemo17{

                   char c[] = str1.toCharArray() ;

                   for(int i=0;i&lt;c.length;i++){

                            System.out.print(c[i]+"\t") ;

3、  将一個字元數組變為字元串

       public <b>String</b>(char[] value)

public class OODemo18{

                   char c[] = {'a','b','c','d','e'} ;

                   System.out.print(new String(c)) ;

4、  判斷在一個字元串中是否包含一個一個指定的字元串

       public int indexOf(String str) ;如果查到了則傳回位置,否則傳回-1。

public class OODemo19{

                   String str = "ABCDEFG" ;

                   System.out.println(str.indexOf("ABC")) ;

                   if(str.indexOf("ABC")!=-1){

                            System.out.println("查到了指定内容。") ;

                   }else{

                            System.out.println("沒有查到指定内容。") ;

5、  按照位置截取一定長度的字元串

       public String substring(int beging,int end)

public class OODemo20{

                   System.out.println(str.substring(0,3)) ;

6、  如以下的字元串:“A:B:C”,按照“:”進行字元串拆分

       public String[] split(String str) ;

public class OODemo21{

                   String str = "A:B:C" ;

                   String s[] = str.split(":") ;

                   for(int i=0;i&lt;s.length;i++){

                            System.out.println(s[i]) ;

7、  将“Hello World!!!”字元串中的“o”替換成“x”

       public String replace(String str)

public class OODemo22{

                   String str = "hello world!!!" ;

                   System.out.println(str.replace("o","x")) ;

8、  判斷一個字元串是否是以“**”開頭或結尾。

       以指定的字元串開頭:public boolean startsWith(String str)

       以指定的字元串結尾:public boolean endsWith(String str)

public class OODemo23{

                   String str = "**hello**" ;

                   System.out.println(str.startsWith("**")) ;

                   System.out.println(str.endsWith("**")) ;

9、  給定以下字元串:“MIKE:70|JONES:80|TOM:75”

       要求拆分成以下格式:

              · MIKE       à    70

              · JONES     à    80

              · TOM        à   75

public class OODemo24{

                   String str = "MIKE:70|JONES:80|TOM:75" ;

                   System.out.println("\"\'\\") ;

                   // 拆分兩次

                   String s1[] = str.split("\\|") ;

                   for(int i=0;i&lt;s1.length;i++){

                            String s2[] = s1[i].split(":") ;

                            System.out.println(s2[0]+" --&gt; "+s2[1]) ;

10、取出字元串“Hello world”中的第三個字元

       public char charAt(int ind) ;

public class OODemo25{

                   String str = "helwo" ;

                   System.out.println(str.charAt(2)) ;

11、一個指定的字元數組,将其中指定位置的字元變為字元串

public <b>String</b>(char[] value, int offset, int count)

public class OODemo26{

                   char c[] = {'h','e','l','w','o'} ;

                   System.out.println(new String(c,1,3)) ;

12、如何可以進行不區分大小寫的比較?

       public boolean equalsIgnoreCase(String str)

public class OODemo27{

                   String str2 = "ABC" ;

                   System.out.println(str1.equalsIgnoreCase(str2)) ;

<b>繼續探讨對象的引用傳遞</b>

       現在觀察以下三道題目,分析其記憶體空間的指向,并說出結果。

class Demo{

         int x ;

public class Demo29{

                   Demo d1 = new Demo() ;

                   d1.x = 30 ;

                   fun(d1) ;

                   System.out.println(d1.x) ;

         public static void fun(Demo d2){

                   d2.x = 50 ;

public class Demo30{

                   String str = "abc" ;

                   fun(str) ;

                   System.out.println(str) ;

         public static void fun(String s){

                   s = "bcd" ;

         String name ;

public class Demo31{

                   Demo d = new Demo() ;

                   d.name = "abc" ;

                   fun(d) ;

                   System.out.println(d.name) ;

         public static void fun(Demo x){

                   x.name = "bcd" ;

本文轉自 李興華 51CTO部落格,原文連結:http://blog.51cto.com/lixinghua/91235,如需轉載請自行聯系原作者