亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

深入學(xué)習(xí)Java編程中的字符串的進(jìn)階使用

 更新時間:2016年01月16日 08:56:13   作者:cdai  
這篇文章主要介紹了Java編程中的字符串的高級運(yùn)用,包括StringBuffer類和StringTokenizer類以及常量池的介紹,需要的朋友可以參考下

JAVA雖然是在C++基礎(chǔ)上發(fā)展而來,但卻對C++的許多缺陷有所改進(jìn),其中一個不得不提的就是字符串,我們知道,隨著學(xué)習(xí)的深入,進(jìn)入MFC時,當(dāng)處理字符串或字符時,常會需要通過_T()宏將字符或字符串變成UNICODE型,否則,會在處理中出現(xiàn)BUG,而在JAVA中,字符char或存儲在Character類中的字符,不是一個字節(jié),而是2個字節(jié),采用UNICODE,這是為了支持全世界上的所有字符。

        字符的序列組成字符串,有兩種類型的字符串:一種是創(chuàng)建以后不需要修改的,稱為字符串常量,在JAVA中,用String類存儲;
     一種是創(chuàng)建以后需要對其進(jìn)行修改的,稱為字符串變量,在JAVA中,用StringBuffer類操作和管理。

 StringBuffer類

1、創(chuàng)建StringBuffer類對象

     StringBuffer類對象表示的是字符串變量(注意是"變量"),每一個StringBuffer類對象都是可以擴(kuò)充和修改的字符串變量。以下是常用的StringBuffer類構(gòu)造函數(shù):

      (1)public StringBuffer()

       創(chuàng)建一個新的空的StringBuffer類的對象,其容量初值設(shè)置成16個字符(注意是16個字符)

   (2)public StringBuffer(int length)

       創(chuàng)建一個新的空的StringBuffer類的對象,其容量初值設(shè)置成length個字符

    (3)public StringBuffer(String str)

       創(chuàng)建一個新的StringBuffer類的對象,其內(nèi)容為str的內(nèi)容,容量設(shè)置成str長度再加16個字符 (注意:再加上16個字符)


2、StringBuffer類對象的常用方法

     (1)StringBuffer類對象的擴(kuò)充

         StringBuffer類提供兩組方法用來擴(kuò)充StringBuffer對象所包含的字符,分別是:

        1)public StringBuffer append

                            (Object  obj)

          append方法用于擴(kuò)充StringBuffer對象所包含的字符,該方法將指定的參數(shù)對象轉(zhuǎn)化為字符串后,將其附加在原來的StringBuffer對象之后,并返回新的StringBuffer對象。附加的的參數(shù)對象可以是各種數(shù)據(jù)類型的,如int、char、String、double等。

2)public StringBuffer insert(

        int插入位置offset,參數(shù)對象類型,參數(shù)對象名)

    該方法將指定的參數(shù)對象轉(zhuǎn)化為字符串后,將其插入在原來的StringBuffer對象中指定的位置,并返回新的StringBuffer對象。

    (2)StringBuffer類對象的長度與容量

    一個StringBuffer類對象的長度指的是它包含的字符個數(shù);容量指的是被分配的字符空間的數(shù)量。

     1)public int length()

        該方法返回當(dāng)前StringBuffer類對象包含的字符個數(shù)。

    2)public int capacity()

   該方法返回當(dāng)前StringBuffer類對象分配的字符空間的數(shù)量。
(3)StringBuffer類對象的修改

   public void setCharAt(intindex,charch)

     該方法將當(dāng)前StringBuffer對象中的index位置的字符替換為指定的字符ch。

    (4)字符串的賦值和加法

      字符串是在程序中要經(jīng)常使用的數(shù)據(jù)類型,在Java編譯系統(tǒng)中引入了字符串的賦值和加法操作。

   (5)其它方法類似String類的方法
3、利用StringTokenizer類分解字符串

StringTokenizer類位于java.util包中, 在使用該類時在程序開始加上

importjava.util.StringTokenizer或

importjava.util.*

StringTokenizer類

對于StringTokenizer類,其主要作用是將字符串按照給定的分割符進(jìn)行分割,其功能和String類的split方法類似

1、StringTokenizer類的構(gòu)造函數(shù)

(1)StringTokenizer(Stringstr)

         為給定的字符串str創(chuàng)建一個StringTokenizer對象,其分隔符默認(rèn)設(shè)置為“\t\n\r\f”,亦即:空格、水平制表符tab、換行、回車、表格符

(2)StringTokenizer(String str,String delim)

              為給定的字符串str創(chuàng)建一個StringTokenizer對象,其分隔符為指定的字符串delim,默認(rèn)不包含分隔符

 


3)StringTokenizer(String str,String delim,boolean returnDelims)

             為給定的字符串str創(chuàng)建一個StringTokenizer對象,其分隔符為指定的字符串delim,如果returnDelims為true,則創(chuàng)建的StringTokenizer對象中的每個字符串包含有分隔符,否則不包含分隔符

2、StringTokenizer類的常用方法

nIntcountTokens()
返回StringTokenizer對象中被分割后子字符串的個數(shù)
nBooleanhasMoreElements()
該方法的功能和hasMoreTokens()方法的功能一樣
nBooleanhasMoreTokens()
檢測StringTokenizer對象中是否包含分割好的子字符串,有則返回true,否則返回false
ObjectnextElement()

該方法具有nextToken()一樣的功能,主要區(qū)別是它返回的不是String對象,而是一個Object對象

StringnextToken()

返回StringTokenizer對象中下一個分割好的子字符串

StringnextToken(String delim)

返回StringTokenizer對象中下一個分割好的子字符串,但是分隔符被重新設(shè)定為delim

n其實(shí)在有些編程語言中,比如C語言,其字符串就是由字符數(shù)組構(gòu)成的,每個字符串的結(jié)尾用“\0”標(biāo)志,但是在Java中卻不是這樣的。
n在Java中,字符串通常是作為String類的對象存在著,如:Strings=“I like Java!”,其中“Ilike Java!”就是一個對象。
所以說,Java中的字符串和字符數(shù)組是完全不相同的,和C語言中的字符串也是不一樣的!

 


n為了方便字符串和字符數(shù)組的轉(zhuǎn)換,在String類中提供了許多這樣的構(gòu)造函數(shù)和方法
n如構(gòu)造函數(shù)String(char[] value)
n方法toCharArray()
方法valueOf(char[] data)


常量池

對于源程序中出現(xiàn)的字符串常量,當(dāng)程序運(yùn)行時,會統(tǒng)一保存到一個常量池中進(jìn)行緩存。
對引用這些緩存在常量池中的字符串的變量進(jìn)行比較,用==也會得到正確的結(jié)果。

但在運(yùn)行時,對字符串的各種操作如+、substring等等,都是會產(chǎn)生新的字符串對象的。
但是強(qiáng)大的編譯器會對字符串常量的拼接進(jìn)行優(yōu)化,諸如s3 = "hell" + "o"時,s3仍然會
指向常量池中的字符串。但對于變量的運(yùn)算,總不能要求虛擬機(jī)執(zhí)行諸如s1 + s2時還要
判斷結(jié)果是否已在常量池中了吧。因此,要用equals而非==去判斷兩個字符串是否相等。

public static void main(String[] args) { 
 
 // String constants are put in constant pool. 
 String s1 = "hello"; 
 String s2 = "hello"; 
 String s3 = "hell" + "o"; 
 System.out.println(s1 == s2); 
 System.out.println(s1 == s3); 
  
 // Operation like +,substring on string create new one. 
 String s4 = "hell"; 
 String s5 = s4 + "o"; 
 System.out.println(s1 == s5); 
 System.out.println(s1.equals(s5)); 
  
 // substring has special handle on substring(0) 
 String s6 = s1.substring(0); 
 System.out.println(s1 == s6); 
} 

測試代碼s1、s2、s3的字節(jié)碼:

   0:   ldc     #16; //String hello
   2:   astore_1
   3:   ldc     #16; //String hello
   5:   astore_2
   6:   ldc     #16; //String hello
   8:   astore_3

測試代碼s4、s5的字節(jié)碼:
  
   41:  ldc     #30; //String hell
   43:  astore  4
   45:  new     #32; //class java/lang/StringBuilder
   48:  dup
   49:  aload   4
   51:  invokestatic    #34; //Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;
   54:  invokespecial   #40; //Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
   57:  ldc               #43; //String o
   59:  invokevirtual   #45; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   62:  invokevirtual   #49; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;

注意一點(diǎn)是substring方法,substring(0,3)是得到從字符0到2的字符串。這樣設(shè)計的原因
也許是這樣容易計算子串的長度,3-0=3。同時substring對于特殊參數(shù)有特別的優(yōu)化處理:

public String substring(int beginIndex, int endIndex) { 
 if (beginIndex < 0) { 
  throw new StringIndexOutOfBoundsException(beginIndex); 
 } 
 if (endIndex > count) { 
  throw new StringIndexOutOfBoundsException(endIndex); 
 } 
 if (beginIndex > endIndex) { 
  throw new StringIndexOutOfBoundsException(endIndex - beginIndex); 
 } 
 return ((beginIndex == 0) && (endIndex == count)) ? this : 
  new String(offset + beginIndex, endIndex - beginIndex, value); 
} 

由此看出,String對象背后并沒有什么神奇之處,對字節(jié)碼有了些了解可以更好的理解它。
其實(shí)常量池中還保存類及其方法的很多信息,如包名、類名、方法簽名等等,有興趣可以
深入研究。

相關(guān)文章

  • 深入了解Java中的過濾器Filter和監(jiān)聽器Listener

    深入了解Java中的過濾器Filter和監(jiān)聽器Listener

    這篇文章主要為大家詳細(xì)介紹了Java中的過濾器Filter和監(jiān)聽器Listener的使用以及二者的區(qū)別,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2022-06-06
  • Java線程安全和鎖Synchronized知識點(diǎn)詳解

    Java線程安全和鎖Synchronized知識點(diǎn)詳解

    在本篇文章里小編給大家分享的是關(guān)于Java線程安全和鎖Synchronized相關(guān)知識點(diǎn),有需要的朋友們可以參考下。
    2019-08-08
  • mybatis中幾種typeHandler的定義使用詳解

    mybatis中幾種typeHandler的定義使用詳解

    本文主要介紹了mybatis中幾種typeHandler的定義使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 掌握SpringMVC中@InitBinder的實(shí)際應(yīng)用

    掌握SpringMVC中@InitBinder的實(shí)際應(yīng)用

    這篇文章主要介紹了掌握SpringMVC中@InitBinder的實(shí)際應(yīng)用,@InitBinder是Spring MVC框架中的一個注解,用于自定義數(shù)據(jù)綁定的方法,通過在控制器中使用@InitBinder注解,可以將特定的數(shù)據(jù)綁定邏輯應(yīng)用于請求參數(shù)的處理過程中,需要的朋友可以參考下
    2023-10-10
  • 快速了解JAVA垃圾回收機(jī)制

    快速了解JAVA垃圾回收機(jī)制

    這篇文章主要介紹了有關(guān)Java垃圾回收機(jī)制的知識,文中實(shí)例簡單易懂,方便大家更好的學(xué)習(xí),有興趣的朋友可以了解下
    2020-06-06
  • java 序列化與反序列化的實(shí)例詳解

    java 序列化與反序列化的實(shí)例詳解

    這篇文章主要介紹了java 序列化與反序列化的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • Java編程之內(nèi)置觀察者模式實(shí)例詳解

    Java編程之內(nèi)置觀察者模式實(shí)例詳解

    這篇文章主要介紹了Java編程之內(nèi)置觀察者模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了java內(nèi)置觀察者模式的原理、實(shí)現(xiàn)方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • SpringBoot?AOP?Redis實(shí)現(xiàn)延時雙刪功能實(shí)戰(zhàn)

    SpringBoot?AOP?Redis實(shí)現(xiàn)延時雙刪功能實(shí)戰(zhàn)

    本文主要介紹了SpringBoot?AOP?Redis實(shí)現(xiàn)延時雙刪功能實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • SpringBoot URL帶有特殊字符([]/{}等),報400錯誤的解決

    SpringBoot URL帶有特殊字符([]/{}等),報400錯誤的解決

    這篇文章主要介紹了SpringBoot URL帶有特殊字符([]/{}等),報400錯誤的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java封裝數(shù)組實(shí)現(xiàn)包含、搜索和刪除元素操作詳解

    Java封裝數(shù)組實(shí)現(xiàn)包含、搜索和刪除元素操作詳解

    這篇文章主要介紹了Java封裝數(shù)組實(shí)現(xiàn)包含、搜索和刪除元素操作,結(jié)合實(shí)例形式分析了java針對數(shù)組元素的查找、刪除、判斷等相關(guān)操作封裝與使用技巧,需要的朋友可以參考下
    2020-03-03

最新評論