Java中的特殊String類介紹-創(chuàng)新互聯(lián)

一、String類簡(jiǎn)介

1、基礎(chǔ)簡(jiǎn)介

字符串是一個(gè)特殊的數(shù)據(jù)類型,屬于引用類型。String類在Java中使用關(guān)鍵字final修飾,所以這個(gè)類是不可以繼承擴(kuò)展和修改它的方法。String類用處極廣泛,在對(duì)String對(duì)象進(jìn)行初始化時(shí),和基本類型的包裝器類型一樣,可以不使用new關(guān)鍵字構(gòu)造對(duì)象。(是真的妖嬈...)

公司主營(yíng)業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)公司推出永昌免費(fèi)做網(wǎng)站回饋大家。

2、類構(gòu)造和方法

  • String類結(jié)構(gòu)

特點(diǎn):final關(guān)鍵字修飾,實(shí)現(xiàn)Serializable序列化接口,Comparable比較接口,和CharSequence字符序列接口。

final class String
   implements java.io.Serializable,
   Comparable<String>, CharSequence
  • 聲明方式

兩種方式,常量和創(chuàng)建對(duì)象。

String var1 = "cicada" ;      
String var2 = new String("smile") ;

var1:聲明的是一個(gè)常量,顯然是放在常量池中。

var2:創(chuàng)建字符串對(duì)象,對(duì)象存放在堆內(nèi)存中。

二、常見(jiàn)應(yīng)用

1、比較判斷

常量池用來(lái)存放常量;堆內(nèi)存用來(lái)存放new出來(lái)的引用對(duì)象。

public class String02 {
   public static void main(String[] args) {
     String var1 = "cicada" ;
     String var2 = "cicada" ;
     // true;true
     System.out.println((var1==var2)+";"+var1.equals(var2));
     String var3 = new String("cicada");
     String var4 = new String("cicada");
     // false;true
     System.out.println((var3==var4)+";"+var3.equals(var4));
     // false;true
     System.out.println((var1==var4)+";"+var2.equals(var4));
     String var5 = "ci"+"cada";
     // true;true
     System.out.println((var1==var5)+";"+var5.equals(var4));
     String var6 = new String02().getVar6 () ;
     // true;true
     System.out.println((var1==var6)+";"+var6.equals(var4));
   }
   public String getVar6 (){
     return "cicada" ;
   }
}

==:對(duì)于基本類型,比較的是值,對(duì)于引用類型,比較的是地址的值;

equals:該方法源自O(shè)bject中一個(gè)最基礎(chǔ)的通用方法,在Object的方法中使用==判斷地址的值,只是到了String類中進(jìn)行了重寫,用于字符內(nèi)容的比較,該方法在繼承關(guān)系中的變化,追蹤JDK源碼,變化非常清楚。

2、編碼解析

字符串在String內(nèi)部是通過(guò)一個(gè)char[]數(shù)組表示,Unicode統(tǒng)一的編碼表示的字符,char類型的字符編碼由此來(lái)。

  • 構(gòu)造源碼

這里看下構(gòu)造方法就會(huì)明白上面的概念邏輯。

private final char value[];
public String() {this.value = "".value;}
public String(String original) {
   this.value = original.value;
   this.hash = original.hash;
}
  • 編碼轉(zhuǎn)換

不同的國(guó)家和地區(qū),使用的編碼可能是不一樣的,互聯(lián)網(wǎng)中有UTF8編碼又是最常用,一次在程序開(kāi)發(fā)中,經(jīng)常需要編碼之間轉(zhuǎn)換。

public class String03 {
   public static void main(String[] args) throws Exception {
     String value = "Hello,知了";
     // UTF-8
     byte[] defaultCharset = value.getBytes(Charset.defaultCharset());
     System.out.println(Arrays.toString(defaultCharset));
     System.out.println(new String(defaultCharset,"UTF-8"));
     // GBK
     byte[] gbkCharset = value.getBytes("GBK");
     System.out.println(Arrays.toString(gbkCharset));
     System.out.println(new String(gbkCharset,"GBK"));
     // ISO-8859-1:表示的字符范圍很窄,無(wú)法表示中文字符,轉(zhuǎn)換之后無(wú)法解碼
     byte[] isoCharset = value.getBytes("ISO8859-1");
     System.out.println(Arrays.toString(isoCharset));
     System.out.println(new String(isoCharset,"ISO8859-1"));
     // UTF-16
     byte[] utf16Charset = value.getBytes("UTF-16");
     System.out.println(Arrays.toString(utf16Charset));
     System.out.println(new String(utf16Charset,"UTF-16"));
   }
}

兩個(gè)基礎(chǔ)概念:

編碼Encode:信息按照規(guī)則從一種形轉(zhuǎn)換為另一種形式的過(guò)程,簡(jiǎn)稱編碼;

解碼Decode:解碼就是編碼的逆向過(guò)程。

3、格式化操作

在日常開(kāi)發(fā)中,字符串的格式不會(huì)都滿足業(yè)務(wù)要求,通常就需要進(jìn)行指定格式化操作。

public class String04 {
   public static void main(String[] args) {
     // 指定位置拼接字符串
     String var1 = formatStr("cicada","smile");
     System.out.println("var1="+var1);
     // 格式化日期:2020-03-07
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
     Date date = new Date() ;
     System.out.println(format.format(date));
     // 浮點(diǎn)數(shù):此處會(huì)四舍五入
     double num = 3.14159;
     System.out.print(String.format("浮點(diǎn)類型:%.3f %n", num));
   }
   public static String formatStr (String ...var){
     return String.format("key:%s:route:%s",var);
   }
}

上面案例演示應(yīng)用場(chǎng)景:Redis緩存Key生成,日期類型轉(zhuǎn)換,超長(zhǎng)浮點(diǎn)數(shù)的截取。

4、形參傳遞問(wèn)題

String對(duì)象形參傳遞到方法里的時(shí)候,實(shí)際上傳遞的是引用的拷貝。

public class String05 {
   String var1 = "hello" ;
   int[] intArr = {1,2,3};
   public static void main(String[] args) {
     String05 objStr = new String05() ;
     objStr.change(objStr.var1,objStr.intArr);
     // hello  4
     System.out.println(objStr.var1);
     System.out.println(objStr.intArr[2]);
   }
   public void change (String var1,int[] intArr){
     var1 = "world" ;
     intArr[2] = 4 ;
   }
}

案例中改變的是var1引用的拷貝,方法結(jié)束執(zhí)行結(jié)束,形參var1被銷毀, 原對(duì)象的引用保持不變。數(shù)組作為參數(shù)傳遞時(shí)傳遞是數(shù)組在內(nèi)存中的地址值,這樣直接找到數(shù)組在內(nèi)存中的位置。

5、String工具類

字符串的處理在系統(tǒng)開(kāi)發(fā)中十分的常見(jiàn),通常會(huì)提供一個(gè)工具類統(tǒng)一處理,可以基于一個(gè)框架中的工具類二次封裝,也可以全部自行封裝。

class StringUtil {
   private StringUtil(){}
   public static String getUUid (){
     return UUID.randomUUID().toString().replace("-","");
   }
}

上面是字符串工具類最基礎(chǔ)的一個(gè)。不同框架中自帶的工具類也不錯(cuò)。

org.apache.commons.lang3.StringUtils
org.springframework.util.StringUtils
com.alibaba.druid.util.StringUtils

這里推薦第一個(gè),也可以把自定義的工具類繼承該工具類,提供更豐富的公共方法。

絮叨一句:代碼整潔之道的基礎(chǔ),就是有一顆《偷懶》的心,花點(diǎn)心思該封裝的封裝,該刪除的刪除。

三、擴(kuò)展API

1、StringBuffer類

字符串修改拼接常用的API,內(nèi)部的實(shí)現(xiàn)過(guò)程和String類似。

public class String07 {
   public static void main(String[] args) {
     StringBuffer var = new StringBuffer(2) ;
     var.append("what");
     var.append("when");
     System.out.println(var);
   }
}

看到上面幾行代碼的反應(yīng),基本能反應(yīng)編程的年齡:

一年:API是這樣用的,沒(méi)毛病;

三年:StringBuffer是線程安全的,效率相對(duì)偏低;

五年:默認(rèn)字符數(shù)組大小是16,這里自定義字符數(shù)組的大小,如果長(zhǎng)度不夠需要擴(kuò)容,所以要預(yù)估一下字符串的可能大小,減小消耗;

絮叨一句:Java中許多容器對(duì)象的大小默認(rèn)是16,且具備動(dòng)態(tài)擴(kuò)容機(jī)制,這就是傳說(shuō)中的編程思想,在開(kāi)發(fā)中照葫蘆畫瓢的寫兩段,這就是格調(diào)。

2、StringBuilder類

這個(gè)類出現(xiàn)比StringBuffer要晚很多,從JDK1.5才開(kāi)始出現(xiàn)。

public class String08 {
   public static void main(String[] args) {
     StringBuilder var = new StringBuilder() ;
     var.append("how").append("what") ;
     System.out.println(var);
   }
}

用法和StringBuffer差不多,不過(guò)是非線程安全操作,效率自然要高。

補(bǔ)刀一句:對(duì)于線程安全和操作和非安全操作,還有初始容量和擴(kuò)容這種邏輯,都可以在源碼中查看,這是進(jìn)階程序員的必備意識(shí)。

3、再看傳參問(wèn)題

這里原理解釋同上,根本邏輯是一致的。

public class String09 {
   public static void main(String[] args) {
     String var1 = new String("A");
     String var2 = new String("B");
     StringBuffer var3 = new StringBuffer("C");
     StringBuffer var4 = new StringBuffer("D");
     join(var1,var2);
     join(var3,var4);
     //A<>B
     System.out.println(var1+"<>"+var2);
     //C<>DD
     System.out.println(var3+"<>"+var4);
   }
   public static void join (String s1,String s2){
     s1 = s2 ;
     s2 = s1+s2 ;
   }
   public static void join (StringBuffer s1,StringBuffer s2){
     s1 = s2 ;
     s2 = s2.append(s1) ;
   }
}

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前題目:Java中的特殊String類介紹-創(chuàng)新互聯(lián)
文章鏈接:http://www.muchs.cn/article2/diejoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站內(nèi)鏈、營(yíng)銷型網(wǎng)站建設(shè)網(wǎng)站策劃、動(dòng)態(tài)網(wǎng)站、網(wǎng)站維護(hù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)