日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java基础篇(02):特殊的String类,和相关扩展API

發布時間:2025/3/17 java 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java基础篇(02):特殊的String类,和相关扩展API 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文源碼:GitHub·點這里 || GitEE·點這里

一、String類簡介

1、基礎簡介

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

2、類構造和方法

  • String類結構

特點:final關鍵字修飾,實現Serializable序列化接口,Comparable比較接口,和CharSequence字符序列接口。

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

兩種方式,常量和創建對象。

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

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

var2:創建字符串對象,對象存放在堆內存中。

二、常見應用

1、比較判斷

常量池用來存放常量;堆內存用來存放new出來的引用對象。

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

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

equals:該方法源自Object中一個最基礎的通用方法,在Object的方法中使用==判斷地址的值,只是到了String類中進行了重寫,用于字符內容的比較,該方法在繼承關系中的變化,追蹤JDK源碼,變化非常清楚。

2、編碼解析

字符串在String內部是通過一個char[]數組表示,Unicode統一的編碼表示的字符,char類型的字符編碼由此來。

  • 構造源碼

這里看下構造方法就會明白上面的概念邏輯。

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

不同的國家和地區,使用的編碼可能是不一樣的,互聯網中有UTF8編碼又是最常用,一次在程序開發中,經常需要編碼之間轉換。

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

兩個基礎概念:

編碼Encode:信息按照規則從一種形轉換為另一種形式的過程,簡稱編碼;

解碼Decode:解碼就是編碼的逆向過程。

3、格式化操作

在日常開發中,字符串的格式不會都滿足業務要求,通常就需要進行指定格式化操作。

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

上面案例演示應用場景:Redis緩存Key生成,日期類型轉換,超長浮點數的截取。

4、形參傳遞問題

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

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 4System.out.println(objStr.var1);System.out.println(objStr.intArr[2]);}public void change (String var1,int[] intArr){var1 = "world" ;intArr[2] = 4 ;} }

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

5、String工具類

字符串的處理在系統開發中十分的常見,通常會提供一個工具類統一處理,可以基于一個框架中的工具類二次封裝,也可以全部自行封裝。

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

上面是字符串工具類最基礎的一個。不同框架中自帶的工具類也不錯。

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

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

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

三、擴展API

1、StringBuffer類

字符串修改拼接常用的API,內部的實現過程和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);} }

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

一年:API是這樣用的,沒毛病;

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

五年:默認字符數組大小是16,這里自定義字符數組的大小,如果長度不夠需要擴容,所以要預估一下字符串的可能大小,減小消耗;

絮叨一句:Java中許多容器對象的大小默認是16,且具備動態擴容機制,這就是傳說中的編程思想,在開發中照葫蘆畫瓢的寫兩段,這就是格調。

2、StringBuilder類

這個類出現比StringBuffer要晚很多,從JDK1.5才開始出現。

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

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

補刀一句:對于線程安全和操作和非安全操作,還有初始容量和擴容這種邏輯,都可以在源碼中查看,這是進階程序員的必備意識。

3、再看傳參問題

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

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<>BSystem.out.println(var1+"<>"+var2);//C<>DDSystem.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) ;} }

絮叨一句:String相關API傳參問題,工作前三年跳槽基本都會被問到,如果不了解基本原理,心情再有點小慌,還基本會答錯。

四、源代碼地址

GitHub·地址 https://github.com/cicadasmile/java-base-parent GitEE·地址 https://gitee.com/cicadasmile/java-base-parent

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的Java基础篇(02):特殊的String类,和相关扩展API的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。