最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java學(xué)習(xí)記錄:java的基本程序設(shè)計結(jié)構(gòu)(一)

2022-12-15 19:17 作者:冰靈___Ling  | 我要投稿

public class test {
????public static void main(String[] args) {
????}
}

首先,java區(qū)分大小寫。如果把關(guān)鍵字打錯了,程序會運行錯誤。

其次,java定義類、變量、函數(shù)等都不得使用java保留字。

關(guān)鍵字public(公眾的)稱為訪問修飾符,這些修飾符用于控制程序的其他部分對這段代碼的訪問級別。(第五章會更詳細地介紹訪問修飾符的有關(guān)內(nèi)容。)

關(guān)鍵字class表明java程序中的全部內(nèi)容都包含在類中。(下一章會詳細講,現(xiàn)在只需要將類看作程序邏輯的一個容器,定義了應(yīng)用程序的行為。類是所有java應(yīng)用的構(gòu)建模塊。Java程序中的所有內(nèi)容都必須放在類中)。

關(guān)鍵字class后面緊跟類名。Java中定義類名的規(guī)則很寬松。類名必須以字母開頭,后面可以跟字母和數(shù)字的任意組合。長度基本上沒限制。

標準命名約定為:類名是以大寫字母開頭的名詞。如果名字由多個單詞組成,每個單詞的第一個字母都應(yīng)該大寫。這種在一個單詞中間使用大寫字母的方式有時稱為駱駝命名法(camel case)。以其自身為例,應(yīng)該寫為CamelCase。

源代碼的文件名必須與公共類的類名相同,并用.Java作為擴展名。

(再次提醒:大小寫很重要)

如果已經(jīng)正確地命名文件,并且源代碼中沒有任何錄入錯誤,在編譯這個源代碼之后,會得到一個包含這個類字節(jié)碼的文件。Java編譯器將這個字節(jié)碼文件自動地命名為類名.class,并存儲在源文件所在地同一個目錄下。最后,使用下面這個命令運行這個程序:java 類名

(請記住,不要加.class擴展名。)程序執(zhí)行之后,控制臺上將會運行這個程序。

當(dāng)使用這個命令:java ClassName運行一個已編譯的程序時,Java虛擬機總是從指定類中main方法的代碼開始執(zhí)行(“方法”就是“函數(shù)”),因此為了能夠執(zhí)行代碼,類的源代碼中必須包含一個main方法。當(dāng)然,也可以將你自己的方法添加到類中,并從main方法調(diào)用這些方法(詳情請見第四章)

【根據(jù)java語言規(guī)范,main方法必須聲明為public】

在java中,用大括號劃分程序的各個部分(俗稱“塊”)。Java中任何方法都必須以“{”開始,以“}”結(jié)束。(注:java解釋器會忽略空白符)

我們暫且不考慮關(guān)鍵字static void,只把它們當(dāng)作編譯java程序必要的部分就行了(到第四章一切揭曉)現(xiàn)在需要記住的是,每個java應(yīng)用都必須有一個main方法。

點號(.)用于調(diào)用方法。Java的通用語法是:Object.method(parameters)這等價于一個函數(shù)調(diào)用。

Java使用雙引號界定字符串。

Java的方法可以沒有參數(shù),也可以有一個或多個參數(shù)。即使一個方法沒有參數(shù),也需要使用空括號。(實參argument)

System.out還有一個print方法,它不在輸出之后增加換行符。println方法在輸出之后增加換行符。

在java中由3種標記注釋的方法:

1.?使用//(雙斜杠)表示從//開始到本行結(jié)尾都是注釋。

2.?/*和*/注釋界定符將一段比較長的注釋括起來。從/*到*/都是注釋。

3.?這一種可以用來自動生成文檔。這種注釋以/**開始,*/結(jié)束。(詳情見第四章)

【警告:在java中,/**/注釋不能嵌套。也就是不能簡單地把代碼用/*和*/括起來作為注釋,因為這段代碼本身可能包含一個*/界定符?!?/p>

java是一種強類型語言。這就意味這必須為每一個變量聲明一個類型。在java中,一共有8種基本類型(primitive type),其中有4種整型、2種浮點類型、1種字符類型char(用于表示Unicode編碼地代碼單元)和1種用于表示真值地boolean類型。(注釋:java有一個能夠表示任意精度的算術(shù)包,所謂的“大數(shù)”(big number)是java對象,而不是一個基本java類型。)

整型用于表示沒有小數(shù)部分的數(shù),可以是負數(shù)。Java提供了4種整型。

類型int存儲需求4b取值范圍-2147483648~2147483647

類型short存儲需求2b取值范圍-32768~32767

類型long存儲需求8b取值范圍-9223372036854775808~9223372036854775807

類型byte存儲需求1b取值范圍-128~127

Byte和short類型主要用于特定的應(yīng)用場合,例如,底層的文件處理或者存儲空間有限時的大數(shù)組。

在java中,整型的范圍與運行java代碼的機器無關(guān)。Java的各種數(shù)據(jù)類型的取值范圍是固定的。

長整型數(shù)值有一個后綴L或1(如4000000000L)。十六進制數(shù)值有一個前綴0x或0X(如0xCaFE)。八進制有一個前綴0(例如,010對應(yīng)十進制中的8)。顯然,八進制表示法比較容易混淆,所以很少有程序員使用八進制常數(shù)。加上前綴0b或0B可以寫二進制數(shù)。例如0b1001是9。

另外,可以為數(shù)字字面量加下劃線,如用1_000_000(或0b1111_0100_0010_0100_0000)表示100萬。這些下劃線只是為了讓人更易讀。Java編譯器會去除這些下劃線。

(注:java沒有無符合(unsigned)形式的int、long、short或byte類型。)

(注:如果使用不可能為負的整數(shù)值而且確實需要額外的一位(bit),也可以把有符號整數(shù)值解釋為無符號數(shù),但是要非常仔細。例如,一個byte值b可以不表示-128~127的范圍,如果你想表示0~255的范圍,也可以存儲在一個byte中?;诙M制算術(shù)運算的性質(zhì),只要不溢出,加法、減法、乘法都能正常計算。但對于其他運算,需要調(diào)用Byte.toUnsignedInt(b)來得到一個0~255的int值,然后處理這個整數(shù)值,再把它轉(zhuǎn)換回byte。Integer和Long類都提供了處理無符號除法和求余數(shù)的方法。)

浮點類型用于表示有小數(shù)部分的數(shù)值。在java中有兩種浮點類型。

類型float存儲需求4b取值范圍大約±3.40282347e38(6~7位有效數(shù)字)

類型double存儲需求8b取值范圍大約±1.79769313486231570e308(15位有效數(shù)字)

double表示這種類型的數(shù)值精度是float類型的兩倍(有人稱之為雙精度數(shù)(double precision)。很多情況下,float類型的精度(6~7位有效數(shù)字)都不能滿足需求。實際上,只有很少的情況適合使用float類型,例如,所使用的庫需要單精度數(shù),或者需要存儲大量單精度數(shù)時。

float類型的數(shù)值有一個后綴F或f(例如,3.14F)。沒有后綴F的浮點數(shù)值(如3.14)總是默認為double類型??蛇x地,也可以在double數(shù)值后面添加后綴D或d(例如,3.14D)。

【注:可以使用十六進制表示浮點數(shù)字面量。例如,0.125 = 2^(-3)可以寫成0x1.0p-3。在十六進制表示法中,使用p表示指數(shù),而不是e。(e是一個十六進制數(shù)位。)注意,尾數(shù)采用十六進制,指數(shù)采用十六進制,指數(shù)采用十進制。指數(shù)的基數(shù)是2,而不是10.】

所有的浮點數(shù)計算都遵循IEEE 754規(guī)范。具體來說,有3個特殊的浮點數(shù)值表示溢出和出錯情況:正無窮大、負無窮大、NaN(不是一個數(shù))

例如:一個正整數(shù)除以0的結(jié)果為正無窮大。計算0/0或者負數(shù)的平方根結(jié)果為NaN。

【常量Double(或Float).POSITIVE_INFINITY表示正無窮大、常量Double(或Float).NEGATIVE_INFINITY表示負無窮大、常量Double(或Float).NaN表示NaN(不是一個數(shù))。

但是在實際中很少用到它們。特別要說明的是,不能如下檢測一個特定結(jié)果是否等于Double(Float).NaN:

if(x == Double.NaN)//is never true

所有NaN的值都認為是不相同的。不過,可以使用Double.isNaN方法來判斷:

if(x == Double.isNaN)//check whether x is "not a number"

【警告:浮點數(shù)值不適合用于無法接受舍入誤差的金融計算。例如,命令System.out.println(2.0-1.1)將打印出0.8999999999999999,而不是我們期待的0.9。這種舍入誤差的主要原因時浮點數(shù)值采用二進制表示,而在二進制系統(tǒng)中無法精確地表示分數(shù)1/10.這就好像十進制無法精確地表示分數(shù)1/3一樣。如果需要精確的數(shù)值計算,不允許有舍入誤差,則應(yīng)該使用BIgDecimal(decimal:小數(shù)、十進制、十進位)類,本章稍后將介紹這個類?!?/strong>

char類型原本用于表示單個字符。不過,現(xiàn)在情況已經(jīng)有所改變。如今,有些Unicode字符可以用一個char值描述,另一些Unicode字符則需要兩個char值。(詳細信息請閱讀下一節(jié))

char類型的字面量值要用單引號括起來。例如:‘A’是編碼值為65的字符常量。它與“A”不同,“A”是包含一個字符的字符串。char類型的值可以表示為十六進制值,其范圍從\u0000~\uFFFF例如,\u2122表示商標符號(?),\u03C0表示希臘字母π。

除了轉(zhuǎn)義序列\(zhòng)u之外,還有一些用于表示特殊字符的轉(zhuǎn)義序列。可以在加引號的字符字面量或字符串中使用這些轉(zhuǎn)義序列。例如,‘\u2122’或“hello\n”。轉(zhuǎn)義序列\(zhòng)u還可以在加引號字符常量或字符串之外使用(而其他所有轉(zhuǎn)義序列不可以)。例如:

public static void main(String\u005B\u005D arges)

就是完全合法的,\u005B表示“[”;\u005D表示“]”

部分特殊字符的轉(zhuǎn)義序列:

\b(退格)【\u0008】

\t(制表)【\u0009】

\n(換行)【\u000a】

\r(回車)【\u000d】

\f(換頁)【\u000c】

\”(雙引號)【\u0022】

\’(單引號)【\u0027】

\\(反斜線)【\u005c】

\s(空格。在文本塊中用來保留末尾空白符)【\u0020】

\newline(只在文本塊中使用:連接這一行和下一行)

【警告:Unicode轉(zhuǎn)義序列會在解析代碼之前處理。例如:

"\u0022+\u0022"

并不是一個由引號(U+0022)包圍加號構(gòu)成的字符串。實際上,\u0022會在解析之前轉(zhuǎn)換為“,這會得到””+””,也就是一個空串。

更隱秘地,一定要當(dāng)心注釋中的\u。以下注釋:

// \u000A is a newline

會產(chǎn)生語法錯誤,因為讀程序時\u000A會替換為一個換行符。類似地,下面這個注釋

// look inside c:\users

也會產(chǎn)生一個語法錯誤,因為\u后面并沒有跟著4位十六進制數(shù)。

?

碼點是指與一個編碼表中的某個字符對應(yīng)的代碼值。

在Unicode標準中,碼點采用十六進制書寫,并加上前綴U+,例如U+0041就是拉丁字母A的碼點。

Unicode的碼點可以分成17個代碼平面(code plane)。

第一個代碼平面稱為基本多語言平面(basic multilingual plane),包括碼點從U+0000到U+FFFF的“經(jīng)典”Unicode代碼;其余的16個平面的碼點從U+10000到U+10FFFF,包含各種輔助字符(supplementary character)。

UTF-16編碼采用不同長度的代碼表示所有Unicode碼點。在基本多語言平面中每個字符采用16位表示,通常稱為代碼單元(code unit);而輔助字符編碼為一對連續(xù)的代碼單元。采用這種編碼對表示的每個值都屬于基本多語言平面中未使用的2048個值范圍,通常稱為替代區(qū)域(surrogatae area)(U+D800~U+D8FF用于第一個代碼單元,U+DC00~U+DFFF用于第二個代碼單元。)

這樣設(shè)計十分巧妙,因為可以很快知道一個代碼單元使一個字符的編碼還是一個輔助字符的第一或第二部分。例如:是八元數(shù)集(http://math.urc.edu/home/baez/octonions)的數(shù)學(xué)符號,碼點為U+1D546,編碼為兩個代碼單元U+D835和U+DD46.(關(guān)于編碼算法的具體描述見http://tools.ietf.org/html/rfc2781。)

在java中,char類型描述了采用UTF-16編碼的一個代碼單元。

強烈建議不要在程序中使用char類型,除非確實需要處理UTF-16代碼單元。最好將字符串作為抽象數(shù)據(jù)類型處理(有關(guān)內(nèi)容見下文。)

布爾(boolean)類型有兩個值:false和true,用來判定邏輯條件。整型值和布爾值之間不能進行相互轉(zhuǎn)換。

[在C/C++中,數(shù)值甚至指針可以代替布爾值。值0相當(dāng)于布爾值false,非0值相當(dāng)于布爾值true。在java中則不是這樣。因此,java程序員不會遇到以下麻煩:if(x = 0)//oops.....meant x == 0

在C/C++中這個測試可以編譯運行,其結(jié)果總是false。而在java中,這個測試將不能通過編譯,其原因是整數(shù)表達式x = 0不能轉(zhuǎn)換為布爾值。]

在java中,每個變量都有一個類型(type)。聲明一個變量時,先指定變量的類型,然后是變量名。

注意每個聲明都以分號結(jié)束。由于聲明是一個完整的java語句,而所有java語句都以分號結(jié)束,所以這里的分號是必須的。

作為變量名(以及其他名字)的標識符由字母、數(shù)字、貨幣符號以及“標點連接符”組成。第一個字符不能是數(shù)字。

‘+’和‘@’之類的符號不能出現(xiàn)在變量名中,空格也不行。字母區(qū)分大小寫:main和Main是不同的標識符。標識符的長度基本上沒有限制。

與大多數(shù)程序設(shè)計語言相比,java中“字母”“數(shù)字”和“貨幣符號”的范圍更大。字母是指一種語言中表示字母的任何Unicode字符。類似地數(shù)字包括‘0’~‘9’和表示一位數(shù)字的任何Unicode字符。貨幣符號為¥、$等。標點連接符包括下劃線字符”_”、波浪線(“~”?)以及其他一些符號。實際上大多數(shù)程序員都總是使用A-Z、a-z、0~9和下劃線“_”

【提示:如果想要知道標識符中可以使用哪些Unicode字符,可以使用Character類的isjavaIdentifierStart和isJavaIdentifierPart方法來檢查。

提示:盡管$是一個合法的標識符字符,但不要在你自己的代碼中使用這個字符。它只用于java編譯器或其他工具生成的名字。】

另外,不能使用java關(guān)鍵字作為變量名。

在java9起,單下劃線“_”是一個保留字。(在將來的版本可能使用_作為通配符。P.s反正現(xiàn)在是用不了。)

可以在一行中聲明多個變量:

int i, j;//both are integers

?

不過,不提倡使用這種風(fēng)格。分別聲明每一個變量可以提高程序的可讀性。

聲明一個變量之后,必須用賦值語句顯式地初始化變量。否則將報錯。

Java中可以將聲明放在代碼中的任何地方。

在java中,變量的聲明要盡可能靠近第一次使用這個變量的地方,這是一種很好的編程風(fēng)格。

【注釋:從java10開始,對于局部變量,如果可以從變量的初始值推斷出它的類型就不再需要聲明類型。只需使用關(guān)鍵字var而無須指定類型:

var vacationDays = 12;//vacationDays is an int
var greeting = "hello";//greeting is a String

下一章會看到,這個特性可以讓對象聲明更為簡潔(耗時會多嗎?)】

在java中,可以用關(guān)鍵字final指示常量。例如:

final double CM_PER_INCH = 2.54

關(guān)鍵字final表示這個變量只能被賦值一次。一旦賦值,就不能再更改了。習(xí)慣上,常量名使用全大寫。

在Java中,可能經(jīng)常需要創(chuàng)建一個常量以便在一個類的多個方法中使用,通常將這些常量稱為類常量(class constant)??梢允褂藐P(guān)鍵字static final設(shè)置一個類常量。下面是使用類常量的一個例子:

public class haihaihai {
????public static final double apex = 3.1415926;
????public static void main(String[] args){
????????System.out.println(apex);
????}
}

需要注意,類常量的定義位于main方法之外。這樣一來,同一類的其他方法也可以使用這個常量。另外,如果一個常量被聲明為public(如這個例子中所示),那么其他類的方法也可以使用這個常量。對于這個例子,其他類可以通過haihaihai.apex使用這個類常量。

枚舉類型:有時候,一個變量只包含有限的一組值。例如,銷售的服裝或比薩只有小、中、大和超大這四種尺寸。當(dāng)然可以將這些尺寸分別編碼為整數(shù)1、2、3、4或字符S、M、L、X。但這種設(shè)置很容易出錯。很可能在變量中保存一個錯誤的值(如0或m)

針對這種情況,可以自定義枚舉類型(enumerated type)。枚舉類型包括有限個命名值。例如,

enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE }
現(xiàn)在,可以聲明這種類型的變量
Size s = Size.MEDIUM

Size類型的變量只能存儲這個類型聲明中所列的某個值,或者特殊值null,null表示這個變量沒有設(shè)置任何值。(枚舉類型以后會講)

注意:整數(shù)被零除將產(chǎn)生一個異常,而浮點數(shù)被零除將會得到一個無窮大或NaN結(jié)果。

【注意:可移植性是java程序設(shè)計語言的設(shè)計目標之一。無論是哪個虛擬機上運行,同一運算應(yīng)該得到同樣的結(jié)果。對于浮點數(shù)的算術(shù)運算,實現(xiàn)這樣的可移植性是相當(dāng)困難的。Double類型使用64位存儲一個數(shù)值,而有些處理器使用80位浮點寄存器。這些寄存器增加了中間步驟的計算精度。

不過,結(jié)果可能與始終使用64位計算的結(jié)果不一樣。為了提高可移植性,java虛擬機的最初規(guī)范規(guī)定所有的中間計算都必須完成截斷。這種做法遭到了數(shù)值社區(qū)的反對。常用處理器上的截斷操作會耗費時間,所以計算速度會減慢。因此,java程序設(shè)計語言認識到最優(yōu)性能與理想的可再生性之間存在沖突,并做出了相應(yīng)改進。允許虛擬機設(shè)計者對中間計算采用擴展精度。不過,用strictfp關(guān)鍵字標記的方法必須使用嚴格的浮點計算來生成可再生的結(jié)果。

如今,處理器已經(jīng)非常靈活了,它們可以高效地完成64位運算。在java17中,再次要求虛擬機完成嚴格的64位運算,strictfp關(guān)鍵字現(xiàn)在已經(jīng)過時了?!?/span>

Math類中包含你可能會用到的各種數(shù)學(xué)函數(shù),這取決于你要編寫什么類型的程序。

【注釋:println方法和sqrt方法有一個微小的差異。println方法處理System.out對象,而Math類中的sqrt方法并不處理任何對象,這樣的方法被稱為靜態(tài)方法(static method)。有關(guān)靜態(tài)方法的詳細內(nèi)容見后文】

在java中,沒有完成冪運算的運算符,因此必須使用Math類的pow方法。Pow方法有兩個double類型的參數(shù),其返回結(jié)果也為double類型。

floorMod方法是為了解決一個長期存在的有關(guān)整數(shù)余數(shù)的問題。下面考慮這樣一個問題:計算一個時鐘時針的位置。這里要做一個調(diào)整,你想歸一化為一個0~11之間的數(shù)。這很簡單:(position+adjustment)%12。不過,如果這個調(diào)整為負數(shù)會怎么樣呢?你可能會得到一個負數(shù)。所以要引入一個分支,或者使用((position+adjustment)%12+12)%12.不過怎樣都很麻煩。

floorMod方法就讓這個問題變得容易了:floorMod(position+adjustment,12)總會得到一個0~11之間的數(shù)(遺憾的是,對于負除數(shù),floorMod會得到負數(shù)結(jié)果,不過這種情況在實際中不常出現(xiàn)。):

int x = 9;
int a = -4;
int y = Math.floorMod(x,a);

結(jié)果是-3

————————————————————————

int x = -9;
int a = 4;
int y = Math.floorMod(x,a);

結(jié)果是3

?

Math類提供了一些常用的三角函數(shù):

Math.sin

Math.cos

Math.tan

Math.atan

Math.atan2

還提供了指數(shù)函數(shù)以及它的反函數(shù)——自然對數(shù)和以10為底的對數(shù):

Math.exp(指數(shù)函數(shù))

Math.log(自然對數(shù))

Math.log10

最后,還提供了兩個常量來表示π和e常量最接近的近似值:

Math.PI

Math.E

【提示:不必在數(shù)學(xué)方法名和常量名前添加前綴“Math”,只要在源文件最上面加上下面這行代碼就可以了。

Import static java.lang.Math.*;

靜態(tài)導(dǎo)入以后會講】

【注釋:在Math類中,為了達到最佳的性能,所有的方法都是用計算機浮點單元中的例程。如果得到一個完全可預(yù)測的結(jié)果比運行速度更重要的話,就應(yīng)該使用StrictMath類。它實現(xiàn)了“可自由分發(fā)數(shù)學(xué)庫(Freely Distributable Math Library, FDLIBM)”(www.netlib.org/fdlibm)的算法,確保在所有平臺上得到相同的結(jié)果。】

【注釋:Math類提供了一些方法使整數(shù)運算更安全。如果一個計算溢出,數(shù)學(xué)運算符只是悄悄地返回錯誤的結(jié)果而不做任何提醒。例如,10億乘以3(100000000*3)地計算結(jié)果將是-1294967296,因為最大地int值也只是剛剛超過20億。不過,如果調(diào)用Math.multiplyExact(100000000*3),就會產(chǎn)生一個異常。你可以捕獲這個異常或者讓程序終止,而不是允許它給出一個錯誤地結(jié)果然后悄無聲息地繼續(xù)運行。另外,還有一些方法(addExact、subtractExact、incrementExact、decrementExact、negateExact和absExact)也可以正確地處理int和long參數(shù)?!?/span>

經(jīng)常需要將一個數(shù)值類型轉(zhuǎn)換為另一種數(shù)值類型。下面是數(shù)值類型之間的合法轉(zhuǎn)換。

byte——》short——》int——》long;

char——》int;

int——》double;

float——》double;

-------------------------------------------------

int--------->float;

long-------->float;

long--------->double;

上面有六個“——》”箭頭,表示無信息丟失的轉(zhuǎn)換;另外有三個“------->”箭頭,表示可能有精度損失的轉(zhuǎn)換。

例如,123456789是一個大整數(shù),它包含的位數(shù)多于float類型所能表示的位數(shù)。將這個整數(shù)轉(zhuǎn)換為float類型時,數(shù)量級是正確的,但是會損失一些精度。(float的小數(shù)點位數(shù)是6~7位)

int n = 123456789;
float f = n;//f is 1.23456792E8

當(dāng)用一個二元運算符連接兩個值時(例如n+f,n是整數(shù),f是浮點數(shù)),先要將兩個操作數(shù)轉(zhuǎn)換為同一種類型,然后再進行計算。

【1.如果兩個操作數(shù)中有一個是double類型,另一個操作數(shù)就會轉(zhuǎn)換為double類型。2.否則,如果其中一個操作數(shù)是float類型,另一個操作數(shù)將會轉(zhuǎn)換為float類型。3.否則,如果其中一個操作數(shù)是long類型,另一個操作數(shù)將會轉(zhuǎn)換為long類型。4.否則,兩個操作數(shù)都將被轉(zhuǎn)換為int類型?!?/strong>

在必要的時候,int類型的值將會自動地轉(zhuǎn)換為double類型。但另一方面,有時也需要將double類型轉(zhuǎn)換int類型。在java中,允許進行這種數(shù)值轉(zhuǎn)換,不過當(dāng)然可能會丟失一些信息。這種可能損失信息地轉(zhuǎn)換要通過強制類型轉(zhuǎn)換(cast)來完成。強制類型轉(zhuǎn)換的語法格式是在圓括號中指定想要轉(zhuǎn)換的目標類型,后面緊跟轉(zhuǎn)換的變量名。例如:

double x = 9.997;
int nx = (int)x;

這樣,變量nx的值為9,因為強制類型轉(zhuǎn)換通過截斷小數(shù)部分將浮點值轉(zhuǎn)換為整型。

如果想舍入(round)一個浮點數(shù)來得到最接近的整數(shù)(大多數(shù)情況下,這種操作更有用),可以使用Math.round方法:

double x = 9.997;
int nx = (int)Math.round(x);

現(xiàn)在,變量nx的值為10.調(diào)用round時,仍然需要使用強制類型轉(zhuǎn)換(int)。原因是round方法的返回值是long類型,由于存在消息丟失的可能性,所以只有使用顯式的強制類型轉(zhuǎn)換才能夠?qū)⒁粋€long值賦給int類型的變量。

【警告:如果試圖將一個數(shù)從一種類型強制轉(zhuǎn)換為另一種類型,而又超出了目標類型的表示范圍,結(jié)果將會截斷成一個完全不同的值。例如,(byte)300實際上會得到44.】

【不要在布爾(boolean)類型與任何數(shù)值類型之間進行強制轉(zhuǎn)換,這樣可以防止發(fā)生一些常見的錯誤。只有極少數(shù)的情況下需要將一個boolean值轉(zhuǎn)換為一個數(shù),此時可以使用條件表達式b?1:0.】

x += 4與x = x +4等價(一般來說,要把運算符放在=號左邊,如*=或%=)

【警告:如果運算符得到一個值,其類型與左側(cè)操作數(shù)的類型不同,就會發(fā)生強制類型轉(zhuǎn)換。(將強制轉(zhuǎn)換為與左側(cè)操作數(shù)類型相同的類型)例如,如果x是一個int,則以下語句:

x += 3.5;是合法的,將把x設(shè)置為(int)(x + 3.5)?!?/p>

需要說明,在java中,賦值是一個表達式(expression)。也就是說,它有一個值,具體來講就是所賦值的那個值??梢允褂眠@個值完成一些操作,例如,可以把它賦給另一個變量??紤]以下語句:

int x = 1;
int y = x += 4;

x += 4的值是5,因為這是賦給x的值。然后將這個值賦給y。

很多程序員發(fā)現(xiàn)這種嵌套賦值很容易混淆。他們更喜歡分別清楚地寫出這些賦值,如下所示:

nt x = 1;
x += 4;
int y = x;

自增與自減運算符:由于這些運算符會改變變量的值,所以不能對數(shù)值本身應(yīng)用這些運算符。

這些運算符又兩種形式:n++(n--);++n(--n)。后綴和前綴形式都會使變量值加1或減1,但是用在表達式中時前綴形式會先完成加1;而后綴形式會使用變量原來的值:

int m = 7;
int n = 7;
int a = 2* ++n;// now a is 16, m is 8
int b = 2* n++;// now b is 14, n is 8

Java包含豐富的關(guān)系運算符。

要檢查相等性,可以使用“==”;

要檢查不相等性,可以使用“!=”;

還有經(jīng)常使用的 <(小于)、>(大于)、<=(小于等于)和 >=(大于等于)運算符。

&&表示邏輯“與”(且);

||表示邏輯“或”;

!是邏輯“非”運算符。

&&和||運算符是按照“短路”方式來求值的:如果第一個操作數(shù)已經(jīng)能夠確定表達式的值,第二個操作數(shù)就不必計算了。

如果用&&運算符結(jié)合兩個表達式,expression1&&expression2

而且已經(jīng)計算得到第一個表達式的真值為false,那么結(jié)果就不可能是true。因此,第二個表達式就不必計算了。可以利用這這種行為來避免錯誤。例如,在下面的表達式中:

x != 0 && 1/x > x + y //no division by 0

如果x等于0,那么第二部分就不會計算。因此,如果x為0,也就不會計算1/x,就不會出現(xiàn)除以0的錯誤。

類似地,如果第一個表達式為true,expression1||expression2的值就自動為true,而無須計算第二個表達式。

條件運算符:java提供了conditional?:運算符,可以根據(jù)一個布爾表達式選擇一個值。如果條件(condition)為true,表達式

condition ? expression1 : expression2

就計算為第一個表達式的值,否則為第二個表達式的值。例如,

x < y ? x : y

會返回x和y中較小的一個。

switch表達式:需要在兩個以上的值中做出選擇時,可以使用switch表達式(java14引入)如下所示:

String seasonName = switch (seasonCode)
{
case 0 ->"Spring";
case 1 ->"Summer";
case 2 ->"Fall";
case 3 ->"Winter";
default ->"???";
};

case標簽還可以是字符串或枚舉類型常量。

【注釋:與所有表達式類似,switch表達式也有一個值。注意各個分支中箭頭”->”放在值前面?!?/p>

【在java14中,switch有4種形式。這只是最有用的一種,剩下的以后會講】

可以為各個case提供多個標簽,用逗號分隔:

int numLetters = switch (seasonName)
{
case "Spring", "Summer", "Winter" -> 6;
case "Fall" -> 4;
default -> -1;
};

switch表達式中使用枚舉類型時,不需要為各個標簽提供枚舉名,這可以從switch值推導(dǎo)得出。例如:enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE};

enum Size {SMALL, MEDIUM, LARGE, EXTRA_LARGE};
...
Size itemSize = ...;
String label = switch (itemSize)
{
case SMALL -> "S";// no need to use Size.SMALL
case MEDIUM -> "M";
case LARGE -> "l";
case EXTRA_LARGE -> "XL";

};

在這個例子中,完全可以省略default,因為每一個可能的值都有相應(yīng)的一個case。

【警告:使用整數(shù)或String操作數(shù)的switch表達式必須有一個defalut,因為不論操作數(shù)值是什么,這個表達式都必須生成一個值?!?/strong>

【警告:如果操作數(shù)為null,會拋出一個NullPointerException】

位運算符:處理整型類型時,還有一些運算符可以直接處理組成整數(shù)的各個位。這意味著可以使用掩碼技術(shù)得到一個數(shù)中的各個位。【這些是在二進制水平】位運算符包括:

&("and") ??|("or") ??^("xor") ??~("not")

這些運算符按位模式操作。例如,如果n是一個整數(shù)變量,而且n的二進制表示中從右邊數(shù)第4位為1,則

int fourthBitFromRight = (n & 0b1000) / 0b1000;

會返回1,否則返回0。利用&并結(jié)合適當(dāng)?shù)?的冪,可以屏蔽其他位,而只留下其中的某一位。

【注釋:應(yīng)用在布爾值上時,&和|運算符也會得到一個布爾值。這些運算符與&&和||運算符很類似,不過&和|運算符不采用”短路“方法來求值,也就是說,計算結(jié)果之前,兩個操作數(shù)都需要計算。(所以會更耗時?)

另外,還有>>(相當(dāng)于除以2的冪次方)和<<(相當(dāng)于乘以2的冪次方)運算符可以將位模式左移或右移。需要建立位模式來完成位掩碼時,這兩個運算符會很方便:

int fourthBitFromRight = (n & (1 << 3)) >> 3;

最后,>>>運算符會用0填充高位,這與<<不同,>>會用符號位填充高位。不存在<<<運算符

警告:移位運算符的右操作數(shù)要完成模32的運算(除非左操作數(shù)是long類型,在這種情況下需要對右操作數(shù)完成模64運算)。例如,1<<35的值等同于1<<3或8?!?/strong>

括號與運算符級別:如果不使用圓括號,就按照這里給出的運算符優(yōu)先級次序進行計算。

同一個級別的運算符按照從左到右的次序進行計算(但右結(jié)合運算符除外,如表所示)。例如,由于&&的優(yōu)先級比||的優(yōu)先級高,所以表達式:

a && b || c

等價于:

(a && b) || c

因為 +=是右結(jié)合運算符,所以表達式:

a += b += c

等價于:

a += (b += c)

也就是將b += c的結(jié)果(完成加法后b的值)加到a上。

【與C/C++不同,java不使用逗號運算符。不過,可以在for語句的第1和第3部分中使用逗號分隔表達式列表。】

優(yōu)先級

運算符

簡介

結(jié)合性

1

[ ]、?.、?( )

方法調(diào)用,屬性獲取

從左向右

2

!、~、 ++、 --

一元運算符

從右向左

3

* 、/ 、%

乘、除、取模(余數(shù))

從左向右

4

+ 、 -

加減法

從左向右

5

<<、 >>、 >>>

左位移、右位移、無符號右移

從左向右

6

< 、<= 、>、 >=、 instanceof

小于、小于等于、大于、大于等于,
對象類型判斷是否屬于同類型

從左向右

7

== 、!=

2個值是否相等,2個值是否不等于。
下面有詳細的解釋

從左向右

8

&

按位與

從左向右

9

^

按位異或

從左向右

10

|

按位或

從左向右

11

&&

短路與

從左向右

12

||

短路或

從左向右

13

?:

條件運算符

從右向左

14

=、 += 、-= 、*= 、/=、 %=、 &=、 |=、 ^=、 <、<= 、>、>= 、>>=

混合賦值運算符

從右向左

?

字符串:從概念上講,java字符串就是Unicode字符序列。例如,字符串“java\u2122”由5個Unicode字符j、a、v、a和?組成。Java沒有內(nèi)置的字符串類型,而是標準java類庫中提供了一個預(yù)定義類,很自然地叫作String。每個用雙引號括起來的字符串都是String類的一個實例:

String e = "";// an empty string
String greeting = "Hello";

子串:String類的substring方法可以從一個較大的字符串提取出一個子串。例如:

String greeting = "Hello";
String s = greeting.substring(0, 3);
會創(chuàng)建一個由字符“Hel”組成的字符串。

substring方法的第二個參數(shù)是你不想復(fù)制的第一個位置。這里要復(fù)制位置為0、1和2(從0到2,包括0和2)的字符。substring會計數(shù),這說明會從0開始,直到3為止,但不包含3。

substring的工作方式有一個優(yōu)點:很容易計算子串的長度。字符串s.substring(a, b)的長度為b-a。例如,子串“Hel”的長度為3 - 0 = 3.

拼接:java語言允許使用“+”號連接(拼接)兩個字符串。

String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;
上述代碼將字符串“Expletivedeleted”賦給變量message(注意,單詞之間沒有空格,+號完全按照給定的次序?qū)蓚€字符串拼接起來)。

當(dāng)將一個字符串與一個非字符串的值進行拼接時,后者會轉(zhuǎn)換成字符串(以后會看到,任何一個java對象都可以轉(zhuǎn)換成字符串)。例如:

int age = 13;
String rating = "PG" + age;
將把rating設(shè)置為“PG13”。

這個特性通常用在輸出語句中。例如:

System.out.println("The answer is" + answer);

這是一條合法的語句,會打印出你希望的結(jié)果(因為單詞is后面加了一個空格,輸出時也會有這個空格)。

如果需要把多個字符串放在一起,用一個界定符分隔,可以使用靜態(tài)join方法:

String all = String.join("/", "s", "m", "l", "xl");// all is the string "s/m/l/xl"

在java11中,還提供了一個repeat方法:

String repeated = “java”.repeat(3);// repeated is "javajavajava"

字符串不可變:

String類沒有提供任何方法來修改字符串中的某個字符。如果希望將greeting的內(nèi)容修改為“Help!”,不能直接將greeting的最后兩個位置的字符修改為‘p’和‘!’。在java中這很容易實現(xiàn)。可以提取想要的子串,再將希望替換的字符拼接:

String greeting = "Hello";
greeting = greeting.substring(0,3) + "p!";

上面這條語句將greeting變量的當(dāng)前值修改為“Help!”。

由于不能修改java字符串中的單個字符,所以在java文檔中將String類對象稱為是不可變的(immutable),如同數(shù)字3永遠是數(shù)字3一樣,字符串“hello”永遠包含字符H、e、l、l和o的代碼單元序列。你不能修改這些值,不過,可以修改字符串變量greeting的內(nèi)容,讓它指向另外一個字符串,這就如同可以讓原本存放3的數(shù)值變量改成存放4一樣。

這樣做難道不會大大降低效率嗎?看起來好像修改代碼單元要比從頭創(chuàng)建一個新字符串更簡單。答案是也對,也不對。的確,通過拼接“Hel”和“p!”來生成一個新字符串的效率確實不高。但是,不可變字符串有一個很大的優(yōu)點:編譯器可以讓字符串共享。

為了弄清具體如何工作,可以想象各個字符串存放一個在公共存儲池中。字符串變量指向存儲池中相應(yīng)的位置了如果復(fù)制一個字符串變量,原始字符串和復(fù)制的字符串共享相同的字符。

總而言之,java的設(shè)計者認為共享帶來的高效率遠遠超過編輯字符串(提取子串和拼接字符串)所帶來的低效率??梢钥纯茨阕约旱某绦?,你會發(fā)現(xiàn),大多數(shù)情況下都不會修改字符串,而只是需要對字符串進行比較。(有一種例外情況,將來自文件或鍵盤的單個字符或較短字符串組裝成更大的字符串。為此,java提供了一個單獨的類(以后會講)

檢測字符串是否相等:

可以使用equals方法檢測兩個字符串是否相等。對于表達式:

s.equals(t)

如果字符串s與字符串t相等,則返回true,否則返回false。需要注意的是,s與t可以是字符串變量,也可以是字符串字面量。例如,以下表達式是合法的:

"Hello".equals(greeting)

要想檢測兩個字符串是否相等,而不區(qū)分大小寫,可以使用equalsIgnoreCase方法。

"Hello".equalsIgnoreCase(greeting)

不要使用==運算符檢測兩個字符串是否相等!這個運算符只能夠確定兩個字符串是否存放在同一個位置上。當(dāng)然,如果字符串在同一個位置上,它們必然相等。但是,完全有可能將多個相等的字符串副本存放在不同的位置上。

String greeting = "Hello";// initialize greeting to a string
if(greeting == "Hello")...//probably true
if(greeting.substring(0, 3) == "Hel")...//probably false

如果虛擬機總是共享相等的字符串,則可以使用==運算符檢測字符串是否相等。但實際上只有字符串字面量會分享,而+或substring等操作得到的字符串并不共享。因此,千萬不要使用==運算符測試字符串的相等性,否則程序中會出現(xiàn)最糟糕的一種bug,這種bug可能會間歇性地隨機出現(xiàn)。

【C程序員從不使用==對字符串進行比較,而是使用strcmp函數(shù)。Java的compareTo方法就類似于strcmp,因此,可以如下這樣使用:

if(greeting.compareTo("Hello") == 0)...

不過,使用equals看起來更為清晰。】

空串與Null串:

空串“”是長度為0的字符串??梢哉{(diào)用以下代碼檢查一個字符串是否為空:

if(str.length()==0)

if(str.equals(""))

空串是一個java對象,有自己的串長度(0)和內(nèi)容(空)。不過,String變量還可以存放一個特殊的值,名為null,表示目前沒有任何對象與該變量關(guān)聯(lián)(以后會詳講)。要檢查一個字符串是否為null,可以使用以下代碼:

if(str == null)

有時要檢查一個字符串既不是null也不是空串,這種情況下可以使用:

if(str != null && str.length() != 0)

首先要檢查str不為null。在以后會看到,如果在一個null值上調(diào)用方法,會出現(xiàn)錯誤。

碼點與代碼單元

Java字符串是一個char值序列。char數(shù)據(jù)類型是采用UTF-16編碼表示Unicode碼點的一個代碼單元。最常用的Unicode字符可以用一個代碼單元表示,而輔助字符需要一對代碼單元表示。

length方法將返回采用UTF-16編碼表示給定字符串所需要的代碼單元個數(shù)。例如:

String greeting = "Hello";
int n = greeting.length();// is 5

要想得到實際長度,即碼點個數(shù),可以調(diào)用:

int cpCount = greeting.codePoint(0, greeting.length());

調(diào)用s.charAt(n)將返回位置n的代碼單元,n介于0~s.length()-1之間。例如:

char first = greeting.charAt(0);// first is 'H'
char last = greeting.charAt(4);// last is 'o'

要想得到第i個碼點,可以使用以下語句:

int index = greeting.offsetByCodePoints(0, i);//code point offset(代碼點偏移量)
Int cp = greeting.codePointAt(index);

為什么會對代碼單元如此大驚小怪?請考慮下面這個句子:

(\uD835\uDD46)is the set of octonions.

使用UTF-16編碼表示字符(\uD835\uDD46)(U+1D546)需要兩個代碼單元。調(diào)用:

char ch = sentence.charAt(1)

返回的一個不是一個空格,而是的第二個代碼單元。為了避免這個問題,不要使用char類型。這太底層了。

【不要以為可以忽略代碼單元在U+FFFF以上的奇怪字符,喜歡emoji表情符號的用戶可能會在字符串中加入類似(U+1F37A,啤酒杯)的字符?!?/p>

如果想要遍歷一個字符串,并且依次查看每一個碼點,可以使用以下語句:

int cp = sentence.codePointAt(i);
i += Character.charCount(cp);

Character.charCount()是java中的內(nèi)置函數(shù),用于確定表示指定字符所需的字符數(shù)。 如果字符等于或大于0x10000,則方法返回2,否則返回1。(就是返回一個字符的代碼單元)

可以使用以下語句實現(xiàn)反向遍歷:

i--;
if(Character,isSurrogate(Sentence(i)))i--;
int cp = sentence.codePointAt(i);

Character.isSurrogate()的作用是確定給定的char值是否為Unicode low-surrogate代碼單元?(也稱為trailing-surrogate代碼單元)。(就是檢查除了第一個代碼平臺的其他代碼平臺的第二個代碼單元。)

顯然,這很麻煩。更容易的辦法是使用codePoints方法,它生成int值的一個“流”,每個int值對應(yīng)一個碼點。(流在卷II介紹。)可以將流轉(zhuǎn)換為一個數(shù)組(以后會講),再完成遍歷。

int[] codePoints = str.codePoints().toArray();

反之,要把一個碼點數(shù)組轉(zhuǎn)換為一個字符串,可以使用構(gòu)造器(以后會講)

String str = new String(codePoints, 0, codePoints.length);

要把單個碼點轉(zhuǎn)換為一個字符串,可以使用Character.toString(int)方法:

int codePoint = 0x1F37A;
str = Character.toString(codePoint);

【虛擬機不一定把字符串實現(xiàn)為代碼單元序列。在java9中使用了一個更緊湊的表示。只包含單字節(jié)代碼單元的字符串使用byte數(shù)組實現(xiàn),所有其他字符串使用char數(shù)組?!?/span>

?

Strng API:

java中的String類包含近100個方法。下面的API注釋匯總了最常用的一些方法。

這里給出的API注釋可以幫助你理解java應(yīng)用程序編程接口(API)。每一個API注釋首先給出類名,如java.lang.String。(java.lang包名的重要性以后會解釋。)類名之后是一個或多個方法的名字、解釋和參數(shù)描述。

API注釋不會列出一個特定類的所有方法,而是會以簡潔的方法給出最常用的一些方法,完整的方法列表請參見聯(lián)機文檔。

類名后面的編號是引入這個類的JDK版本號。如果某個方法是之后添加的,那么這個方法后面還會給出一個單獨的版本號。

?

Java.lang.String 1.0:

·char(類型)charAt(int(類型)index)

返回給定位置的代碼單元。(除非對底層的代碼單元感興趣,否則不需要調(diào)用這個方法)

·int codePointAt(int index) ??5

返回從給定位置開始的碼點。

·int offsetByCodePoints(int startIndex, int cpCount) ?5

返回從startIndex碼點開始,cpCount個碼點后的碼點索引。

·int compareTo(String other)

按照字典順序,如果字符串位于other之前,返回一個負數(shù);如果字符串位于other之后,返回一個正數(shù);如果兩個字符串相等,返回0。

·IntSream codePoints() ?8

將這個字符串的碼點作為一個流返回。調(diào)用toArry將它們放在一個數(shù)組中。

·new String(int[] codePoints, int offest, int count) ??5

用數(shù)組中從offset開始的count個碼點構(gòu)造一個字符串。

·boolean isEmpty()

·boolean isBlank() ?11

如果字符串為空或者由空白符組成,返回true。

·boolean equals(Object other)

如果字符串與other相等,返回true。

·boolean equalsIgnoreCase(String other)

如果字符串與other相等(忽略大小寫),返回true。

·boolean startsWith(Sring prefix)

·boolean endsWith(String suffix)

如果字符串以prefix開頭或以suffix或結(jié)尾,則返回true。

·int indexOf(String str)

·int indexOf(String str, int fromIndex)

·int indexOf(int cp)

·int indexOf(int cp, int fromIndex)

返回與字符串str或碼點cp相等的第一個子串的開始位置。從索引0或fromIndex開始匹配。如果str或cp不在字符串,則返回-1。

·int lastIndexOf(String str)

·int lastIndexOf(String str, int fromIndex)

·int lastIndexOf(int cp)

·int lastIndexOf(int cp, int fromIndex)

返回與字符串str或碼點cp相等的最后一個子串的開始位置。從字符串末尾或fromIndex開始匹配。如果str或cp不在字符串中,則返回-1。

·int length()

返回字符串代碼單元的個數(shù)。

·int codePointCount(int startIndex, int endIndex) ?5

返回startIndex到endIndex - 1之間的碼點個數(shù)。

·String replace(CharSequence oldString, CharSequence newString)

返回一個新字符串,這是用newString替換原始字符串中與oldString匹配的所有子串得到的??梢杂肧tring或StringBuilder對象作為CharSequence參數(shù)。

·String substring(int beginIndex)

·Sring substring(int beginIndex, int endIndex)

返回一個新字符串,這個字符串包含原始字符串中從beginIndex到字符串末尾或endIndex - 1的所有代碼單元。

·String toLowerCase()

·String toUpperCase()

返回一個新字符串,這個字符串包含原始字符串中的所有字符,不過將原始字符串中的大寫字母改為小寫,或者將原始字符串中的小寫字母改成大寫字母。

·String strip() ?11

·String stripLeading() ???11

·String stripTrailing() ???11

返回一個新字符串,這個字符串要刪除原始字符串頭部和尾部或者只是頭部或尾部的空白符。要使用這些方法,而不要使用古老的trim方法刪除小于等于U+0020的字符。

·String join(ChaSequence delimiter, CharSequence ...... elements)?8

返回一個新字符串,用給定的定界符連接所有元素。

·String repeat(int count) ?11

返回一個字符串,將當(dāng)前字符串重復(fù)count次。

?

【注釋:在API注釋中,有一些CharSequence類型的參數(shù)。這是一種接口類型,所有字符串都屬于這個接口。之后將介紹更多有關(guān)接口的內(nèi)容?,F(xiàn)在只需知道,當(dāng)看到一個CharSequence形參(parameter)時,完全可以傳入String類型的實參(argument)?!?/span>

?

閱讀聯(lián)機API文檔:

正如前面看到的,String類包含許多方法。而且,標準庫中有幾千個類,方法數(shù)量更加驚人。要想記住所有有用的類和方法顯然不太可能。因此,學(xué)會使用聯(lián)機API文檔十分重要,從中可以查找標準類庫的所有類和方法??梢詮腛racle下載API文檔,并保存在本地。也可以在瀏覽器中訪問http://docs.oracle.com/en/java/javase/17/docs/api。

?

構(gòu)建字符串:

有些時候,需要由較短的字符串構(gòu)建字符串,例如,按鍵或文件中的單詞。如果采用字符串拼接的方式來達到目的,效率會比較低。每次拼接字符串時,都會構(gòu)建一個新的String對象,既耗時,又浪費空間。使用StringBuilder類就可以避免這個問題。

如果需要用許多小字符串來構(gòu)建一個字符串,可以采用以下步驟,首先,構(gòu)建一個空的字符串構(gòu)造器:

StringBuilder builder = new StringBuilder();

當(dāng)每次需要添加另外一部分時,就調(diào)用append方法:

builder.append(ch);// appends a single character
builder.append(str);// appends a string

字符串構(gòu)建完成時,調(diào)用toString方法。你會得到一個String對象,其中包含了構(gòu)造器中的字符序列:

String completedString = builder.toString();

【注釋:StringBuffer類效率不如StringBuilder類,不過它允許采用多線程的方式添加或刪除字符。如果所有字符串編輯操作都在單個線程中執(zhí)行(通常都是這樣),則應(yīng)當(dāng)使用StringBuilder類。這兩個類的API是一樣的?!?/p>

下面的API注釋包含了StringBuilder類中最重要的方法:

java.lang.StringBuilder 5

·StringBuilder()

構(gòu)造一個空的字符串構(gòu)造器。

·int length()

返回構(gòu)造器或緩沖器中的代碼單元個數(shù)。

·StringBuilder append(String str)

追加一個字符串并返回this。

·StringBuilder append(char c)

追加一個代碼單元并返回this。

·StringBuilder appendCodePoint(int cp)

追加一個碼點,將它轉(zhuǎn)換為一個或兩個代碼單元并返回this。

·void setCharAt(int i, char c)

將第i個代碼單元設(shè)置為c。

·StringBuilder insert(int offest, String str)

在offest位置插入一個字符串并返回this。

·StringBuilder inset(int offset, char c)

在offest位置插入一個代碼單元并返回this。

·StringBuilder delet(int startIndex, int endIndex)

刪除從startIndex到endIndex-1的代碼單元并返回this。

·String toString()

返回一個字符串,其數(shù)據(jù)與構(gòu)建器或緩沖器內(nèi)容相同。

?

文本塊:

利用java15新增的文本塊(text block)特性,可以很容易地提供跨多行的字符串字面量。文本塊以”””開頭(這是開始”””),后面是一個換行符,并以另一個”””結(jié)尾(這是結(jié)束”””)

String greeting = """
Hello
world
""";

文本塊比相應(yīng)的字符串字面量更易于讀寫:

"Hello\nWorld\n"

這個字符串包含兩個\n:一個在Hello后面,另一個在World后面。開始”””后面的換行符不作為字符串字面量的一部分。

String prompt = """
Hello, my name is Hal.
Please enter your name:""";

文本塊特別適合包含用其他語言編寫的代碼,如SQL或HTML。可以直接將那些代碼粘貼到一對三重引號之間:

String html = """
<div>
???Beware of those who say "Hello" to the world
</div>
""";

需要說明的是,一般不用對引號轉(zhuǎn)義。只有兩種情況下需要對引號轉(zhuǎn)義:

1·文本塊以一個引號結(jié)尾。

2·文本塊中包含三個或更多引號組成的一個序列。

遺憾的是,所有反斜線都需要轉(zhuǎn)義。

常規(guī)字符串中的所有轉(zhuǎn)義序列在文本塊中也有同樣的作用。

有一個轉(zhuǎn)義序列只能在文本塊中使用。行尾的\會把這一行與下一行連接起來。例如:

"""
Hello,my name is Hal,\
Please enter your name:""";

等同于:

"Hello, my name is Hal. Please enter your name:"

文本塊會對行結(jié)束符進行標準化,刪除末尾的空白符,并把Windows的行結(jié)束符(\r\n)改為簡單的換行符(\n)。盡管不太可能,不過假如確實需要保留末尾的空格,這種情況下可以把最后一個空格轉(zhuǎn)換為一個\s轉(zhuǎn)義序列。

對于前導(dǎo)空白符則更為復(fù)雜??紤]一個從左邊界縮進的典型的變量聲明。文本塊也可以縮進:

String html = """
<div>
???Beware of those who say "Hello" to the world
</div>
""";

將去除文本塊中所有行的公共縮進。實際字符串為:

String html =
"<div>\n ??Beware of those who say "Hello" to the world</div>\n"
;

注意,第一行和第三行沒有縮進。

你的IDE很可能會使用制表符、空格或者制表符以及空格縮進所有文本塊。

Java很清晰,它沒有規(guī)定制表符的寬度。空白符前綴必須與文本塊中的所有行完全匹配。

去除縮進過程中不考慮空行。不過,結(jié)束”””前面的空白符很重要。一定要縮進到想要去除的空白符的末尾。

【警告:要當(dāng)心縮進文本塊的公共前綴中混用制表符和空格的情況。不小心漏掉一個空格很容易得到一個縮進錯誤的字符串。】

【提示:如果一個文本塊中包含非Java代碼,實際上最好沿左邊界放置。這樣可以與java代碼區(qū)分開,而且可以為長代碼行留出更多空間?!?/p>


【學(xué)習(xí)參考書籍為:《Java核心技術(shù)卷I》】

Java學(xué)習(xí)記錄:java的基本程序設(shè)計結(jié)構(gòu)(一)的評論 (共 條)

分享到微博請遵守國家法律
枣庄市| 弋阳县| 嘉鱼县| 福州市| 麻栗坡县| 广元市| 手游| 清新县| 溧阳市| 房山区| 徐州市| 尼勒克县| 三台县| 莫力| 宣化县| 永清县| 湖口县| 峨山| 泸州市| 抚松县| 西丰县| 富锦市| 澄江县| 桦南县| 青浦区| 桂平市| 乌拉特中旗| 霍邱县| 军事| 龙里县| 包头市| 彩票| 英超| 陇南市| 赤城县| 西和县| 囊谦县| 呼和浩特市| 丰县| 澳门| 绵阳市|