成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《Java編程思想》筆記13.字符串

since1986 / 1121人閱讀

摘要:的構(gòu)造器經(jīng)過(guò)重載可以接受多種輸出目的地,不過(guò)最常用的還是和。組號(hào)為表示整個(gè)表達(dá)式,組號(hào)表示被第一對(duì)括號(hào)括起的組,依此類推。有多個(gè)重載的構(gòu)造器,可以接受和對(duì)象。

點(diǎn)擊進(jìn)入我的博客

字符串操作是計(jì)算機(jī)程序設(shè)計(jì)中最常見(jiàn)的行為

13.1 不可變String

String底層是由char[]實(shí)現(xiàn)的,是不可變的。
看起來(lái)會(huì)改變String的方法,實(shí)際上都是創(chuàng)建了一個(gè)新的String對(duì)象,任何指向它的引用都不可能改變它本身的值。

13.2 重載“+”與StringBuilder

重載操作符的意思是,一個(gè)操作符被用于不同的類時(shí),被賦予類特殊的含義(String++=是Java中僅有的兩個(gè)重載過(guò)的操作符,而且Java不允許程序員重載操作符)。
由于String的不可變性,如果你通過(guò)多個(gè)String相加生成一個(gè)String的時(shí)候,就需要產(chǎn)生多個(gè)中間對(duì)象,這造成了一定的效率問(wèn)題。

StringBuilder的好處

使用String對(duì)字符串進(jìn)行操作時(shí),編譯器會(huì)自動(dòng)幫你轉(zhuǎn)成StringBuilder來(lái)進(jìn)行操作

StringBuilder來(lái)操作字符串,編譯后的代碼通常會(huì)更加簡(jiǎn)單,效率更高

如果字符串比較簡(jiǎn)單,可以使用String讓編譯器為你構(gòu)造最終的字符串結(jié)果;如果要在循環(huán)中使用字符串,那么最好自己創(chuàng)建一個(gè)StringBuilder

13.3 無(wú)意識(shí)的遞歸
    @Override
    public String toString() {
        return "Test" + this;
    }

上述代碼中,由于字符串在拼接的時(shí)候會(huì)自動(dòng)調(diào)用toString()方法,所以會(huì)無(wú)意思造成遞歸。
如果你想打印對(duì)象的內(nèi)存地址,應(yīng)該調(diào)用Object.toString()方法

13.4 String上的操作

13.5 格式化輸出 13.5.1 System.out.printf()

System.out.printf("%d%n", 123)這種輸入方式來(lái)自于C,使用特殊的占位符來(lái)表示數(shù)據(jù)將來(lái)的位置,這些占位符稱作格式修飾符

13.5.2 System.out.format()

System.out.printf()是相同的。

13.5.3 Formatter類

在Java中,所有新的格式化功能都由java.util.Formatter類處理。
Formatter的構(gòu)造器經(jīng)過(guò)重載可以接受多種輸出目的地,不過(guò)最常用的還是PrintStream、OutputStreamFile。

13.5.4 格式化說(shuō)明符

%[argument_index$] [flags] [width] [.precision] conversion

可選的argument_index是一個(gè)十進(jìn)制整數(shù),用于表明參數(shù)在參數(shù)列表中的位置。第一個(gè)參數(shù)由1$引用,第二個(gè)參數(shù)由2$引用,依此類推(不要忘記$)。

可選flags是修改輸出格式的字符集。有效標(biāo)志集取決于轉(zhuǎn)換類型。

可選width是一個(gè)非負(fù)十進(jìn)制整數(shù),表明要向輸出中寫(xiě)入的最少字符數(shù),不足則用空格代替。默認(rèn)數(shù)據(jù)是右對(duì)齊,可以通過(guò)-實(shí)現(xiàn)左對(duì)齊。

可選precision是一個(gè)非負(fù)十進(jìn)制整數(shù),通常用來(lái)限制最大字符數(shù)。特定行為取決于轉(zhuǎn)換類型。

所需conversion是一個(gè)表明應(yīng)該如何格式化參數(shù)的字符。給定參數(shù)的有效轉(zhuǎn)換集取決于參數(shù)的數(shù)據(jù)類型。

13.5.5 Formatter轉(zhuǎn)換

13.5.6 String.format()

該方法可以接受Formatter.format()方法一樣的參數(shù),但返回一個(gè)String對(duì)象。

13.6 正則表達(dá)式

正則表達(dá)式是一種強(qiáng)大而靈活的文本處理工具。使用正則表達(dá)式,我們能夠以編程的方式,構(gòu)造復(fù)雜的文本模式,并對(duì)輸入的字符串進(jìn)行搜索。一旦找到了匹配這些模式的部分,你就能夠隨心所欲地對(duì)它們進(jìn)行處理。

13.6.1 基礎(chǔ)

正則表達(dá)式就是以某種方式來(lái)描述字符串。

Java和其他語(yǔ)言對(duì)反斜線的處理不同

正常反斜線:我們需要的就是一個(gè)單純的反斜線,但Java(包括其他語(yǔ)言)中,反斜線也被用來(lái)當(dāng)作轉(zhuǎn)義字符,所以不能直接使用

文藝反斜線:第一個(gè)反斜線表示轉(zhuǎn)移,第二個(gè)表示正常的反斜線

Java二逼反斜線:在正則表達(dá)式中,反斜線也需要轉(zhuǎn)義,這是如果要插入一條反斜線這需要這種寫(xiě)法。四個(gè)反斜線的作用其實(shí)是兩兩一組,第一組的反斜線作為轉(zhuǎn)義符,第二組的反斜線是正常要插入的反斜線。

String中內(nèi)建的正則匹配方法

String#matches()

String#split()

String#replaceFirst()

String#replaceAll()

13.6.2 創(chuàng)建正則表達(dá)式

正則表達(dá)式完整構(gòu)造子列表,請(qǐng)參考java.util.regex.Pattern

字符

字符類

邏輯操作符

邊界匹配符

13.6.3 量詞
量詞:描述了一個(gè)模式吸收輸入文本的方式:

貪婪型:默認(rèn)設(shè)置,貪婪表達(dá)式會(huì)為所有可能的模式發(fā)現(xiàn)盡可能多的匹配,導(dǎo)致此問(wèn)題的一個(gè)經(jīng)典理由就是假定我們的模式僅能匹配第一個(gè)可能的字符組,如果它是貪婪的,那么它會(huì)繼續(xù)往下匹配;

勉強(qiáng)型:在貪婪型基礎(chǔ)上添加?,這個(gè)量詞匹配滿足模式所需的最少字符數(shù),又稱作最少匹配;

占有型:在貪婪型基礎(chǔ)上添加+,目前這種類型的量詞只有在Java中才可用并且也更高級(jí),當(dāng)正則表達(dá)式被應(yīng)用于字符串時(shí),它會(huì)產(chǎn)生相當(dāng)多的狀態(tài)以便在匹配失敗時(shí)可以回溯,而占有型量詞并不保存這些中間狀態(tài),因此它們可以防止回溯,它們被用來(lái)防止正則表達(dá)式失控,因此可以讓正則表達(dá)式執(zhí)行起來(lái)更有效。

13.6.4 Pattern和Matcher

由于String類功能有限,所以可以通過(guò)java.util.regex包下的類實(shí)現(xiàn)更加復(fù)雜的功能

一般使用方法
    // 1.構(gòu)建Pattern對(duì)象
    Pattern pattern = Pattern.compile("1[0-9]{10}");
    // 2.構(gòu)建Matcher對(duì)象
    Matcher matcher = pattern.matcher("18888888888");
    // 3.使用Matcher方法
    System.out.println(matcher.matches());
Pattern方法
    // 構(gòu)建Pattern對(duì)象
    Pattern pattern = Pattern.compile(regex);
    // 將字符串按照正則表達(dá)式分割
    pattern.split("18888888888");
    // 生成Matcher對(duì)象判斷是否匹配
    pattern.matcher("18888888888");
    // 直接驗(yàn)證正則表達(dá)式和字符串是否匹配
    Pattern.matches("1[0-9]{10}", "18888888888");
Pattern標(biāo)記

Pattern類的compile()方法還有另一個(gè)版本,它接受一個(gè)標(biāo)記參數(shù)數(shù),以調(diào)整匹配的行為:
Pattern Pattern.compile(String regex,int flag);。其中的flag來(lái)自以下Pattern類中的常量:

Matcher方法

組是用括號(hào)劃分的正則表達(dá)式,可以根據(jù)組的編號(hào)來(lái)引用某個(gè)組。組號(hào)為0表示整個(gè)表達(dá)式,組號(hào)1表示被第一對(duì)括號(hào)括起的組,依此類推。因此在下面這個(gè)表達(dá)式:A(B(C))D中有三個(gè)組,組0是ABCD,組1是BC,組2是C。

    // 整個(gè)字符串是否滿足表達(dá)式
    matcher.matches();
    // 判斷字符串中是否包含表達(dá)式
    matcher.lookingAt();
    // 遍歷字符串
    matcher.find();
    matcher.find(int start);
    // 返回前一次匹配的結(jié)果
    matcher.group();
    matcher.groupCount();
    // 返回前一次匹配操作中尋找到的組的起始索引
    matcher.start();
    // 返回前一次匹配操作中尋找到的組的最后一個(gè)字符加一的值
    matcher.end();
    // 替換所有
    matcher.replaceAll();
    // 替換第一個(gè)
    matcher.replaceFirst();
    // 漸進(jìn)式的替換
    matcher.appendReplacement();
    // 將現(xiàn)在Matcher用于一個(gè)新的字符串
    matcher.reset();
13.7 掃描輸入

到日前為止,從文件或標(biāo)準(zhǔn)輸入讀取數(shù)據(jù)還是一件相當(dāng)痛普的事情。終于,Java SE5新增了Scanner類,它可以大大減輕掃描輸入的工作負(fù)擔(dān)。
Scanner有多個(gè)重載的構(gòu)造器,可以接受File、Path、InputStreamStringReadable對(duì)象。Readable是Java SE5中新加入的一個(gè)接口,表示“具有read()方法的某種東西”。

13.7.1 Scanner的定界符

在默認(rèn)的情況下,Scanner根據(jù)空白字符對(duì)輸入進(jìn)行分詞,但是你可以用正則表達(dá)式指定自己所需的定界符:scanner.useDelimiter();。還有一個(gè)delimiter()方法,用來(lái)返回當(dāng)前正在作為定界符使用的Pattern對(duì)象。

13.7.2 用正則表達(dá)式掃描
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNext("(d+)@(w+).(w+)")) {
        scanner.next("(d+)@(w+).(w+)");
        MatchResult result = scanner.match();
        System.out.println("號(hào)碼:" + result.group(1));
        System.out.println("域名:" + result.group(2));
        System.out.println("后綴:" + result.group(3));
    }

Scanner可以接受Pattern作為參數(shù),可以掃描復(fù)雜的數(shù)據(jù)。
配合正則表達(dá)式掃描時(shí)要注意:它僅僅針對(duì)下一個(gè)輸入分詞進(jìn)行匹配,如果你的正則表達(dá)式中含有定界符,那永遠(yuǎn)都不可能匹配成功。

13.8 StringTokenizer

已過(guò)時(shí)!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72333.html

相關(guān)文章

  • Java編程思想筆記3.操作符

    摘要:自動(dòng)拆箱用賦值運(yùn)算符把一個(gè)包裝類賦值給一個(gè)基本類型變量,或者是在包裝類進(jìn)行數(shù)值運(yùn)算時(shí)。指數(shù)計(jì)數(shù),表示的冪按位操作符可以把值看成單比特值對(duì)待,的操作相同,但是不能用于布爾值。移位操作符高位包括符號(hào)位舍棄,低位補(bǔ)零。 點(diǎn)擊進(jìn)入我的博客 3.1更簡(jiǎn)單的打印語(yǔ)句 System.out.println(imbug); 通過(guò)編寫(xiě)一個(gè)小類庫(kù),并通過(guò)import static該方法來(lái)實(shí)現(xiàn)簡(jiǎn)化打?。ɑ?..

    wpw 評(píng)論0 收藏0
  • Java編程思想筆記11.持有對(duì)象

    摘要:迭代器通常被成為輕量級(jí)對(duì)象創(chuàng)建它的代價(jià)很小。與迭代器可以用于數(shù)組和所有對(duì)象,之所以能夠工作,是因?yàn)槔^承了接口。 點(diǎn)擊進(jìn)入我的博客 我覺(jué)得本章名字改成容器似乎更好理解,持有對(duì)象讓人感到一頭霧水我們需要在任意時(shí)刻和任意位置創(chuàng)建任意數(shù)量的對(duì)象,所以依靠創(chuàng)建命名的引用來(lái)持有對(duì)象已經(jīng)滿足不了需求。Java可以用數(shù)組和其他容器類來(lái)(List、Set、Queue、Map)來(lái)解決這個(gè)問(wèn)題,不同的容器...

    newtrek 評(píng)論0 收藏0
  • Java編程思想筆記12.通過(guò)異常處理錯(cuò)誤

    摘要:一旦異常被拋出,就表明錯(cuò)誤已無(wú)法挽回,也不能回來(lái)繼續(xù)執(zhí)行。這種在編譯時(shí)被強(qiáng)制檢查的異常稱為被檢查的異常。通過(guò)獲取原始異常。構(gòu)造器對(duì)于在構(gòu)造階段可能會(huì)拋出異常,并要求清理的類,最安全的做法是使用嵌套的子句。 點(diǎn)擊進(jìn)入我的博客 Java異常處理的目的在于通過(guò)使用少于目前數(shù)量的代碼來(lái)簡(jiǎn)化大型、可靠的程序的生成,并且通過(guò)這種方式可以使你更自信:你的應(yīng)用中沒(méi)有未處理的錯(cuò)誤。 12.1 概念 異...

    Vultr 評(píng)論0 收藏0
  • Java編程思想筆記4.控制執(zhí)行流程

    摘要:在初始化和步進(jìn)控制部分,可以用一系列由逗號(hào)分割的語(yǔ)句,而且那些語(yǔ)句會(huì)獨(dú)立執(zhí)行。和都表示無(wú)限循環(huán)語(yǔ)法數(shù)組等關(guān)鍵詞有兩個(gè)方面的用途一方面指定一個(gè)方法返回什么值另一個(gè)方面指定當(dāng)前的方法退出,并返回那個(gè)值。 點(diǎn)擊進(jìn)入我的博客 4.1 true&false Java的條件語(yǔ)句只能使用布爾值來(lái)決定執(zhí)行路徑 4.2 if-else 4.3 循環(huán)語(yǔ)句 while、for、do-while do-...

    PingCAP 評(píng)論0 收藏0
  • Java編程思想筆記10.內(nèi)部類

    摘要:但遠(yuǎn)不止如此,內(nèi)部類了解外部類,并能與之通信。內(nèi)部類還擁有其外圍類的所有元素的訪問(wèn)權(quán)。普通內(nèi)部類內(nèi)不能有域和方法。特點(diǎn)普通內(nèi)部類對(duì)象隱式的保存了外部類對(duì)象,但嵌套類并非如此。局部?jī)?nèi)部類可以訪問(wèn)當(dāng)前代碼塊內(nèi)的常量,以及此外圍類的成員。 點(diǎn)擊進(jìn)入我的博客 可以把一個(gè)類的定義放在另一個(gè)類的定義內(nèi)部,這就是內(nèi)部類。Java最晦澀的部分之一。內(nèi)部類看起來(lái)就像是一種代碼隱藏機(jī)制,將類只與其他類的...

    wslongchen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<