摘要:的構造器經過重載可以接受多種輸出目的地,不過最常用的還是和。組號為表示整個表達式,組號表示被第一對括號括起的組,依此類推。有多個重載的構造器,可以接受和對象。
點擊進入我的博客
字符串操作是計算機程序設計中最常見的行為
13.1 不可變StringString底層是由char[]實現的,是不可變的。
看起來會改變String的方法,實際上都是創建了一個新的String對象,任何指向它的引用都不可能改變它本身的值。
重載操作符的意思是,一個操作符被用于不同的類時,被賦予類特殊的含義(String的+和+=是Java中僅有的兩個重載過的操作符,而且Java不允許程序員重載操作符)。
由于String的不可變性,如果你通過多個String相加生成一個String的時候,就需要產生多個中間對象,這造成了一定的效率問題。
使用String對字符串進行操作時,編譯器會自動幫你轉成StringBuilder來進行操作
用StringBuilder來操作字符串,編譯后的代碼通常會更加簡單,效率更高
如果字符串比較簡單,可以使用String讓編譯器為你構造最終的字符串結果;如果要在循環中使用字符串,那么最好自己創建一個StringBuilder。
13.3 無意識的遞歸@Override public String toString() { return "Test" + this; }
上述代碼中,由于字符串在拼接的時候會自動調用toString()方法,所以會無意思造成遞歸。
如果你想打印對象的內存地址,應該調用Object.toString()方法
略
13.5 格式化輸出 13.5.1 System.out.printf()System.out.printf("%d%n", 123)這種輸入方式來自于C,使用特殊的占位符來表示數據將來的位置,這些占位符稱作格式修飾符。
13.5.2 System.out.format()跟System.out.printf()是相同的。
13.5.3 Formatter類在Java中,所有新的格式化功能都由java.util.Formatter類處理。
Formatter的構造器經過重載可以接受多種輸出目的地,不過最常用的還是PrintStream、OutputStream和File。
%[argument_index$] [flags] [width] [.precision] conversion
可選的argument_index是一個十進制整數,用于表明參數在參數列表中的位置。第一個參數由1$引用,第二個參數由2$引用,依此類推(不要忘記$)。
可選flags是修改輸出格式的字符集。有效標志集取決于轉換類型。
可選width是一個非負十進制整數,表明要向輸出中寫入的最少字符數,不足則用空格代替。默認數據是右對齊,可以通過-實現左對齊。
可選precision是一個非負十進制整數,通常用來限制最大字符數。特定行為取決于轉換類型。
所需conversion是一個表明應該如何格式化參數的字符。給定參數的有效轉換集取決于參數的數據類型。
13.5.5 Formatter轉換 13.5.6 String.format()該方法可以接受Formatter.format()方法一樣的參數,但返回一個String對象。
13.6 正則表達式正則表達式是一種強大而靈活的文本處理工具。使用正則表達式,我們能夠以編程的方式,構造復雜的文本模式,并對輸入的字符串進行搜索。一旦找到了匹配這些模式的部分,你就能夠隨心所欲地對它們進行處理。
13.6.1 基礎正則表達式就是以某種方式來描述字符串。
正常反斜線:我們需要的就是一個單純的反斜線,但Java(包括其他語言)中,反斜線也被用來當作轉義字符,所以不能直接使用
文藝反斜線:第一個反斜線表示轉移,第二個表示正常的反斜線
Java二逼反斜線:在正則表達式中,反斜線也需要轉義,這是如果要插入一條反斜線這需要這種寫法。四個反斜線的作用其實是兩兩一組,第一組的反斜線作為轉義符,第二組的反斜線是正常要插入的反斜線。
String#matches()
String#split()
String#replaceFirst()
String#replaceAll()
13.6.2 創建正則表達式正則表達式完整構造子列表,請參考java.util.regex.Pattern。
貪婪型:默認設置,貪婪表達式會為所有可能的模式發現盡可能多的匹配,導致此問題的一個經典理由就是假定我們的模式僅能匹配第一個可能的字符組,如果它是貪婪的,那么它會繼續往下匹配;
勉強型:在貪婪型基礎上添加?,這個量詞匹配滿足模式所需的最少字符數,又稱作最少匹配;
占有型:在貪婪型基礎上添加+,目前這種類型的量詞只有在Java中才可用并且也更高級,當正則表達式被應用于字符串時,它會產生相當多的狀態以便在匹配失敗時可以回溯,而占有型量詞并不保存這些中間狀態,因此它們可以防止回溯,它們被用來防止正則表達式失控,因此可以讓正則表達式執行起來更有效。
13.6.4 Pattern和Matcher由于String類功能有限,所以可以通過java.util.regex包下的類實現更加復雜的功能
// 1.構建Pattern對象 Pattern pattern = Pattern.compile("1[0-9]{10}"); // 2.構建Matcher對象 Matcher matcher = pattern.matcher("18888888888"); // 3.使用Matcher方法 System.out.println(matcher.matches());
// 構建Pattern對象 Pattern pattern = Pattern.compile(regex); // 將字符串按照正則表達式分割 pattern.split("18888888888"); // 生成Matcher對象判斷是否匹配 pattern.matcher("18888888888"); // 直接驗證正則表達式和字符串是否匹配 Pattern.matches("1[0-9]{10}", "18888888888");
Pattern類的compile()方法還有另一個版本,它接受一個標記參數數,以調整匹配的行為:
Pattern Pattern.compile(String regex,int flag);。其中的flag來自以下Pattern類中的常量:
組是用括號劃分的正則表達式,可以根據組的編號來引用某個組。組號為0表示整個表達式,組號1表示被第一對括號括起的組,依此類推。因此在下面這個表達式:A(B(C))D中有三個組,組0是ABCD,組1是BC,組2是C。
// 整個字符串是否滿足表達式 matcher.matches(); // 判斷字符串中是否包含表達式 matcher.lookingAt(); // 遍歷字符串 matcher.find(); matcher.find(int start); // 返回前一次匹配的結果 matcher.group(); matcher.groupCount(); // 返回前一次匹配操作中尋找到的組的起始索引 matcher.start(); // 返回前一次匹配操作中尋找到的組的最后一個字符加一的值 matcher.end(); // 替換所有 matcher.replaceAll(); // 替換第一個 matcher.replaceFirst(); // 漸進式的替換 matcher.appendReplacement(); // 將現在Matcher用于一個新的字符串 matcher.reset();13.7 掃描輸入
到日前為止,從文件或標準輸入讀取數據還是一件相當痛普的事情。終于,Java SE5新增了Scanner類,它可以大大減輕掃描輸入的工作負擔。
Scanner有多個重載的構造器,可以接受File、Path、InputStream、String和Readable對象。Readable是Java SE5中新加入的一個接口,表示“具有read()方法的某種東西”。
在默認的情況下,Scanner根據空白字符對輸入進行分詞,但是你可以用正則表達式指定自己所需的定界符:scanner.useDelimiter();。還有一個delimiter()方法,用來返回當前正在作為定界符使用的Pattern對象。
13.7.2 用正則表達式掃描Scanner scanner = new Scanner(System.in); while (scanner.hasNext("(d+)@(w+).(w+)")) { scanner.next("(d+)@(w+).(w+)"); MatchResult result = scanner.match(); System.out.println("號碼:" + result.group(1)); System.out.println("域名:" + result.group(2)); System.out.println("后綴:" + result.group(3)); }
Scanner可以接受Pattern作為參數,可以掃描復雜的數據。
配合正則表達式掃描時要注意:它僅僅針對下一個輸入分詞進行匹配,如果你的正則表達式中含有定界符,那永遠都不可能匹配成功。
已過時!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72333.html
摘要:自動拆箱用賦值運算符把一個包裝類賦值給一個基本類型變量,或者是在包裝類進行數值運算時。指數計數,表示的冪按位操作符可以把值看成單比特值對待,的操作相同,但是不能用于布爾值。移位操作符高位包括符號位舍棄,低位補零。 點擊進入我的博客 3.1更簡單的打印語句 System.out.println(imbug); 通過編寫一個小類庫,并通過import static該方法來實現簡化打?。ɑ?..
摘要:迭代器通常被成為輕量級對象創建它的代價很小。與迭代器可以用于數組和所有對象,之所以能夠工作,是因為繼承了接口。 點擊進入我的博客 我覺得本章名字改成容器似乎更好理解,持有對象讓人感到一頭霧水我們需要在任意時刻和任意位置創建任意數量的對象,所以依靠創建命名的引用來持有對象已經滿足不了需求。Java可以用數組和其他容器類來(List、Set、Queue、Map)來解決這個問題,不同的容器...
摘要:一旦異常被拋出,就表明錯誤已無法挽回,也不能回來繼續執行。這種在編譯時被強制檢查的異常稱為被檢查的異常。通過獲取原始異常。構造器對于在構造階段可能會拋出異常,并要求清理的類,最安全的做法是使用嵌套的子句。 點擊進入我的博客 Java異常處理的目的在于通過使用少于目前數量的代碼來簡化大型、可靠的程序的生成,并且通過這種方式可以使你更自信:你的應用中沒有未處理的錯誤。 12.1 概念 異...
摘要:在初始化和步進控制部分,可以用一系列由逗號分割的語句,而且那些語句會獨立執行。和都表示無限循環語法數組等關鍵詞有兩個方面的用途一方面指定一個方法返回什么值另一個方面指定當前的方法退出,并返回那個值。 點擊進入我的博客 4.1 true&false Java的條件語句只能使用布爾值來決定執行路徑 4.2 if-else 4.3 循環語句 while、for、do-while do-...
摘要:但遠不止如此,內部類了解外部類,并能與之通信。內部類還擁有其外圍類的所有元素的訪問權。普通內部類內不能有域和方法。特點普通內部類對象隱式的保存了外部類對象,但嵌套類并非如此。局部內部類可以訪問當前代碼塊內的常量,以及此外圍類的成員。 點擊進入我的博客 可以把一個類的定義放在另一個類的定義內部,這就是內部類。Java最晦澀的部分之一。內部類看起來就像是一種代碼隱藏機制,將類只與其他類的...
閱讀 3548·2021-08-31 09:39
閱讀 1854·2019-08-30 13:14
閱讀 2919·2019-08-30 13:02
閱讀 2769·2019-08-29 13:22
閱讀 2341·2019-08-26 13:54
閱讀 767·2019-08-26 13:45
閱讀 1586·2019-08-26 11:00
閱讀 982·2019-08-26 10:58