成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

帶你看清Java字符串的世界……

開(kāi)發(fā) 后端
Java 基本類型可謂是 Java 世界里使用最頻繁的數(shù)據(jù)類型了。除此之外,有種數(shù)據(jù)類型你也一定會(huì)遇到,它在 Java 世界里使用也相當(dāng)頻繁。它就是字符串!

 前言

Java 基本類型可謂是 Java 世界里使用最頻繁的數(shù)據(jù)類型了。除此之外,有種數(shù)據(jù)類型你也一定會(huì)遇到,它在 Java 世界里使用也相當(dāng)頻繁。它就是字符串!

聽(tīng)到字符串,你是不是想起了字符這種類型。不過(guò)在 Java 里,字符和字符串是兩種不同的類型。

字符串的定義與形式

字符類型你應(yīng)該比較熟悉,通過(guò)關(guān)鍵詞 char 來(lái)申明一個(gè)字符。

值只能是一個(gè)英文字符或者一個(gè)中文字符或者是 Unicode 編碼,用單引號(hào)包住。如下: 

  1. // char 用 ascii 字符賦值  
  2. char charWithAscii = '.' 
  3. char charWithZh = '牛' 
  4. char a = '\u0041';// 值為 A 

而字符串,顧名思義,就是多個(gè)字符連接而成的串。通過(guò)關(guān)鍵詞 String  來(lái)聲明一個(gè)字符串。

值可以是 null 或者空字符串或者單字符串或者多字符串,用雙引號(hào)包住。如下: 

  1. // null 字符串,未指定地址  
  2. String nullnullStr = null;  
  3. // 空字符串,包含 0 個(gè)字符  
  4. String  blankStr = "" 
  5. // 包含一個(gè)字符  
  6. String oneCharStr = "A" 
  7. // 包含多個(gè)字符,打印 蝸牛666 A  
  8. String multiCharStr = "蝸牛666 \u0041"

你會(huì)發(fā)現(xiàn)字符串的值可以是 null,因?yàn)樽址愋?String 是引用類型,值為 null,就說(shuō)明值不存在,也就是這個(gè)變量不指向任何對(duì)象。這也是它和基本類型 char 的區(qū)別所在。

那作為引用類型,String 就可以通過(guò) new 的方式聲明,比如:

  1. String newnewStr = new String("蝸牛666"); 

另外,你也會(huì)發(fā)現(xiàn)字符串比字符存儲(chǔ)了更豐富的數(shù)據(jù),實(shí)際上,一個(gè)字符串可以存儲(chǔ) 0 到任意多個(gè)字符。只要把數(shù)據(jù)內(nèi)容用雙引號(hào)包起來(lái)就好。

不過(guò),如果你的數(shù)據(jù)內(nèi)容本身就有雙引號(hào),會(huì)發(fā)生什么呢?

沒(méi)錯(cuò),連編譯都過(guò)不去!編譯器會(huì)提示你字符串非法行尾,因?yàn)榫幾g器判斷的時(shí)候,會(huì)把中間引號(hào)當(dāng)成字符串結(jié)尾,導(dǎo)致第三個(gè)引號(hào)開(kāi)始的字符串語(yǔ)法出錯(cuò)。

那此時(shí)就要用到轉(zhuǎn)義字符了,這個(gè) case 里可以通過(guò)反斜杠 \ 轉(zhuǎn)義中間的引號(hào)。

  1. String str = "蝸牛666\""; 

這樣就不會(huì)報(bào)錯(cuò)了。

字符串的存儲(chǔ)方式

我們知道,程序在運(yùn)行時(shí),會(huì)針對(duì)不同類型的變量數(shù)據(jù)做運(yùn)算,最終輸出結(jié)果。那其實(shí)運(yùn)算過(guò)程中的變量數(shù)據(jù)都是存在棧里邊,根據(jù)棧先進(jìn)后出的特點(diǎn),完成程序的運(yùn)行邏輯。而對(duì) Java 這種面向?qū)ο缶幊痰恼Z(yǔ)言,對(duì)象的信息就沒(méi)放棧里邊,而存到了堆里邊,棧只存對(duì)象的引用地址。

另外,有些數(shù)據(jù)要求是不可變的,Java 會(huì)分配一塊常量池出來(lái)。

比如 String 的場(chǎng)景。 

  1. String str1 = "蝸牛666" 
  2. String str2 = "蝸牛666" 
  3. String newnewStr1 = new String("蝸牛666");  
  4. String newnewStr2 = new String("蝸牛666"); 

str1 和 str2 就存儲(chǔ)在常量池中。而常量池中的數(shù)據(jù)只有一份,因此 str1 和 str2 其實(shí)是指向同一塊內(nèi)存空間。

newStr1 和 newStr2 是通過(guò) new 語(yǔ)法創(chuàng)建的對(duì)象,在創(chuàng)建的過(guò)程中,Java 會(huì)先去常量池中查找是否已有 蝸牛666 對(duì)象,如果沒(méi)有則在常量池中創(chuàng)建一個(gè) 蝸牛666 對(duì)象,然后在堆中創(chuàng)建一個(gè) 蝸牛666 的拷貝對(duì)象。

所以 new String("xxx"); 這行代碼會(huì)產(chǎn)生幾個(gè)對(duì)象?

答案是一個(gè)或兩個(gè)。如果常量池中原來(lái)沒(méi)有 xxx,就是兩個(gè)。如果有就是一個(gè)。

字符串的特點(diǎn)

字符串最大的特點(diǎn)就是不可變性。前邊也有提過(guò),字符串在常量池會(huì)有一份,常量這個(gè)信息就說(shuō)明字符串具備不可變性了。

我們看下實(shí)例,你猜下以下程序會(huì)輸出什么: 

  1. String strChange = "蝸牛666" 
  2. System.out.println(strChange);  
  3. strChange = "蝸牛888" 
  4. System.out.println(strChange); 

都是 蝸牛666?因?yàn)樽址豢勺兟?/p>

事實(shí)上不是: 

  1. 蝸牛666  
  2. 蝸牛888 

難道 蝸牛666 被改成 蝸牛888 了?

實(shí)際上不是,蝸牛666 和 蝸牛888 都在,只是 strChange 的指向變了。

程序在執(zhí)行 String strChange = "蝸牛666"; 時(shí),JVM 虛擬機(jī)先在常量池創(chuàng)建字符串 蝸牛666 ,然后把變量 strChange 指向它。

然后在執(zhí)行 strChange = "蝸牛888"; 時(shí),JVM 虛擬機(jī)先在常量池創(chuàng)建字符串 蝸牛888 ,然后把變量 strChange指向它。

所以你會(huì)發(fā)現(xiàn),剛開(kāi)始的字符串 蝸牛666 還在,只是變量 strChange 不再指向它了。

因此,字符串的不可變特性,是指字符串內(nèi)容不可變。

另外,字符串的不可變特性,也帶來(lái)了兩個(gè)好處。

一個(gè)是 String 對(duì)象可以緩存哈希碼。在 String 類的源碼中,你可以看到這么一個(gè)屬性。 

  1. /** Cache the hash code for the string */  
  2. private int hash; // Default to 0 

hash 的值是基于字符串的每個(gè)字符計(jì)算得出。那字符串的不可變特性,就能保證 hash 的唯一性,因此可以緩存起來(lái),被頻繁使用。這也是性能優(yōu)化的一種手段。

另外一個(gè)就是字符串的不可變特性保證了很多場(chǎng)景下的安全。

很多 Java 類庫(kù)都會(huì)選擇 String 作為參數(shù),像文件路徑 path 這些。如果 String 會(huì)經(jīng)常改變,那就有各種安全隱患。

字符串的常用場(chǎng)景

比較

和基本類型相比,字符串也有比較的能力。比如下面的比較方式。 

  1. String equalChar = "蝸牛" 
  2. String euqalCharCompare = "蝸牛" 
  3. System.out.println(equalChar == euqalCharCompare); 

直接常量定義的方式,沒(méi)有問(wèn)題,會(huì)輸出 true 。但如果通過(guò) new 的方式定義那就容易出錯(cuò)了,比如以下的代碼,你知道輸出什么么? 

  1. String equalMethod = new String("蝸牛");  
  2. String euqalMethodCompare = new String("蝸牛");  
  3. System.out.println(equalMethod == euqalMethodCompare); 

會(huì)輸出 false ,而這是不符合我們預(yù)期的。為什么會(huì)這樣呢?

因?yàn)?== 對(duì)于引用類型而言,比較的是引用的地址。而上邊兩個(gè)字符串都是 new 出來(lái)的新對(duì)象。引用地址自然不同。

那如果想只比較內(nèi)容怎么做呢?可以使用 Java String 自帶的 equals 方法!

  1. System.out.println(equalMethod.equals(euqalMethodCompare)); 

此時(shí)就能正常輸出 true 了。

拼接

最簡(jiǎn)單的拼接就是用 + 連接符,比如以下代碼。 

  1. /**  
  2.  * 字符串連接  
  3.  *  
  4.  * @author 蝸牛  
  5.  * @from 來(lái)源:蝸牛互聯(lián)網(wǎng)  
  6.  */  
  7. public class StringConnect {   
  8.     public static void main(String[] args) {  
  9.         String name = "蝸牛" 
  10.         String age = "18" 
  11.         String profile = name + " " + age;  
  12.         System.out.println(profile);  
  13.     }  

運(yùn)行代碼會(huì)輸出:

  1. 蝸牛 18 

我們可以通過(guò)反編譯看下,這段代碼發(fā)生了什么,輸入命令: 

  1. javap -c StringConnect 

我們看到有如下輸出:

你會(huì)發(fā)現(xiàn),加號(hào)連接符實(shí)際上是 Java 編譯器的優(yōu)化,底層是用了 StringBuilder 這個(gè)類,它的 append 方法就起了拼接的效果。

如果拼接的字符串?dāng)?shù)量有限,相對(duì)固定,建議用加號(hào)連接符,這樣一行代碼搞定!

如果拼接的字符串有相關(guān)的邏輯,比如循環(huán)拼接,字符串?dāng)?shù)量不太固定,那建議用 StringBuilder 這個(gè)工具類。

另外, StringBuilder 是線程不安全的,如果你是多線程開(kāi)發(fā)環(huán)境,為了保證程序不出錯(cuò),可以用它的兄弟類 StringBuffer ,這個(gè)類方法和 StringBuilder 一致,只是增加了線程安全的能力。 

 

責(zé)任編輯:龐桂玉 來(lái)源: Java技術(shù)棧
相關(guān)推薦

2021-07-30 06:22:37

C++字符型字符串

2021-03-08 08:23:24

Java字符串截取

2009-06-23 14:13:00

Java字符串

2023-03-07 10:07:04

JavaScript字符串反斜杠

2020-12-21 08:11:46

JVMJDKJRE

2010-09-09 11:48:00

SQL函數(shù)字符串

2011-06-08 15:45:41

字符串JAVA

2013-06-24 15:16:29

Java字符串拼接

2021-05-28 10:02:05

Swift5 字符串String

2024-04-01 08:41:39

字符串.NET

2010-09-14 10:15:24

2010-06-28 15:18:51

SQL Server

2009-06-30 14:16:37

截取字符串

2019-12-17 15:49:44

Java語(yǔ)言字符串

2011-12-20 10:28:01

Java字符串

2011-06-03 13:03:03

JAVA

2011-07-21 15:36:40

JAVA

2022-07-18 08:18:11

字符JavaJDK

2010-03-16 17:30:14

Java多線程編程

2021-07-03 10:02:30

Python字符串瀏覽器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久精品国产一区 | 久久久久久久久精 | 午夜影院在线免费观看视频 | 久久草在线视频 | 成人免费小视频 | 日本三级在线视频 | 黄色av网站免费看 | 午夜爱爱毛片xxxx视频免费看 | 亚洲精品一区在线 | 精品亚洲一区二区三区 | 亚洲狠狠| 亚洲色综合 | 欧美一极视频 | 一区二区在线 | 成年免费大片黄在线观看一级 | 免费看爱爱视频 | 欧美性区 | 精品欧美一区二区在线观看视频 | 亚洲九色| 午夜精品一区二区三区免费视频 | 人人叉| 四虎永久在线精品免费一区二 | 亚洲国产视频一区二区 | 亚洲成人一区 | 亚洲+变态+欧美+另类+精品 | 亚洲电影一区二区三区 | 黄色一级视频 | 日韩一区二区三区在线观看视频 | 精品国产色 | 中文字幕在线网 | 午夜电影网 | 中文在线a在线 | 中文字幕在线精品 | 日韩免费一区二区 | 手机在线观看av | 国产乱码精品一区二区三区中文 | 国产一区亚洲 | 综合久久99 | 国产精品久久久久久久久久免费看 | 国产一区二区三区欧美 | 中文字幕在线观看视频一区 |