本節我們重新來看看我們熟悉的StringUtils。其實這裡面的方法很多。
首先,這個工具類裡面的所有方法,都是針對字元串常見操作,其次,裡面有不少方法,即可以針對String,也可以使用CharSequence;
判斷類
屬于該類别的方法都是在對字元串進行一些判定操作:
//判斷類:
// boolean isEmpty(Object str):字元串是否為空或者空字元串:""
// boolean hasLength(CharSequence str):字元串是否為空,或者長度為0
// boolean hasText(String str):字元串是否有内容(不為空,且不全為空格)
assertFalse(StringUtils.hasText(" "));
// boolean containsWhitespace(String str):字元串是否包含空格
assertTrue(StringUtils.containsWhitespace("a b"));
字元串頭尾操作
屬于該類别的方法,都是對字元串前,或者字元串後的内容進行判定或者操作;
//字元串頭尾操作
// String trimWhitespace(String str):去掉字元串前後的空格
assertEquals("abc", StringUtils.trimWhitespace(" abc "));
// String trimAllWhitespace(String str):去掉字元串中所有的空格
assertEquals("abc", StringUtils.trimAllWhitespace(" a b c "));
// String trimLeadingWhitespace(String str):去掉字元串開頭的空格
// String trimTrailingWhitespace(String str):去掉字元串結束的空格
// String trimLeadingCharacter(String str, char leadingCharacter):去掉字元串開頭的指定字元;
// String trimTrailingCharacter(String str, char trailingCharacter):去掉字元串結尾的指定字元;
// boolean startsWithIgnoreCase(String str, String prefix):
// 判斷字元串是否以指定字元串開頭,忽略大小寫
assertTrue(StringUtils.startsWithIgnoreCase("abcd", "AB"));
// boolean endsWithIgnoreCase(String str, String suffix):
// 判斷字元串是否以指定字元串結尾,忽略大小寫
檔案路徑名稱相關操作
檔案路徑名稱相關操作,是針對檔案名,檔案路徑,檔案字尾等常見檔案操作中需要用到的方法進行封裝;
// String unqualify(String qualifiedName):
// 得到以.分割的最後一個值,可以非常友善的擷取類似類名或者檔案字尾
assertEquals("java", StringUtils.unqualify("cn.wolfcode.java"));
assertEquals("java", StringUtils.unqualify("cn/wolfcode/Hello.java"));
// String unqualify(String qualifiedName, char separator):
// 得到以給定字元分割的最後一個值,可以非常友善的擷取類似檔案名
assertEquals("Hello.java", StringUtils
.unqualify("cn/wolfcode/Hello.java", File.separatorChar));
// String capitalize(String str):首字母大寫
assertEquals("Wolfcode", StringUtils.capitalize("wolfcode"));
// String uncapitalize(String str):取消首字母大寫
assertEquals("java", StringUtils.uncapitalize("Java"));
// String getFilename(String path):擷取檔案名,就不需要再使用FilenameUtils
assertEquals("myfile.txt",
StringUtils.getFilename("mypath/myfile.txt"));
// String getFilenameExtension(String path):擷取檔案字尾名
assertEquals("txt",
StringUtils.getFilenameExtension("mypath/myfile.txt"));
// String stripFilenameExtension(String path):截取掉檔案路徑字尾
assertEquals("mypath/myfile",
StringUtils.stripFilenameExtension("mypath/myfile.txt"));
// String applyRelativePath(String path, String relativePath):
// 找到給定的檔案,和另一個相對路徑的檔案,傳回第二個檔案的全路徑
// 列印:d:/java/wolfcode/other/Some.java
System.out.println(StringUtils.applyRelativePath(
"d:/java/wolfcode/Test.java", "other/Some.java"));
// 但是不支援重新定位絕對路徑和上級目錄等複雜一些的相對路徑寫法:
// 仍然列印:d:/java/wolfcode/../other/Some.java
System.out.println(StringUtils.applyRelativePath(
"d:/java/wolfcode/Test.java", "../other/Some.java"));
// String cleanPath(String path):
// 清理檔案路徑,這個方法配合applyRelativePath就可以計算一些簡單的相對路徑了
// 列印:d:/java/other/Some.java
System.out.println(
StringUtils.cleanPath("d:/java/wolfcode/../other/Some.java"));
// 需求:擷取d:/java/wolfcode/Test.java相對路徑為../../other/Some.java的檔案全路徑:
// 列印:d:/other/Some.java
System.out.println(StringUtils.cleanPath(StringUtils.applyRelativePath(
"d:/java/wolfcode/Test.java", "../../other/Some.java")));
// boolean pathEquals(String path1, String path2):
// 判斷兩個檔案路徑是否相同,會先執行cleanPath之後再比較
assertTrue(StringUtils.pathEquals("d:/wolfcode.txt",
"d:/somefile/../wolfcode.txt"));
字元串和子串的操作
該組方法中主要是提供了字元串和字元串子串的操作,比如子串的比對,子串的替換;子串的删除等等操作;
// boolean substringMatch(CharSequence str, int index, CharSequence
// substring):判斷從指定索引開始,是否比對子字元串
assertTrue(StringUtils.substringMatch("aabbccdd", 1, "abb"));
// int countOccurrencesOf(String str, String sub):判斷子字元串在字元串中出現的次數
assertEquals(4, StringUtils.countOccurrencesOf("ababaabab", "ab"));
// String replace(String inString, String oldPattern, String
// newPattern):在字元串中使用子字元串替換
assertEquals("cdcdacdcd", StringUtils.replace("ababaabab", "ab", "cd"));
// String delete(String inString, String pattern):删除所有比對的子字元串;
assertEquals("a", StringUtils.delete("ababaabab", "ab"));
// String deleteAny(String inString, String charsToDelete):删除子字元串中任意出現的字元
assertEquals("", StringUtils.deleteAny("ababaabab", "bar"));
// String quote(String str) :在字元串前後增加單引号,比較适合在日志時候使用;
assertEquals("'hello'", StringUtils.quote("hello"));
本地化相關
和Locale相關的一些字元串操作;
// Locale parseLocaleString(String localeString):
// 從本地化字元串中解析出本地化資訊,相當于Locale.toString()的逆向方法
assertEquals(Locale.CHINA, StringUtils.parseLocaleString("zh_CN"));
// String toLanguageTag(Locale locale):把Locale轉化成HTTP中Accept-Language能接受的本地化标準;
// 比如标準的本地化字元串為:zh_CN,更改為zh-CN
System.out.println(StringUtils
.toLanguageTag(StringUtils.parseLocaleString("zh_CN")));
字元串和Properties
把字元串和Properties對象之間的互相轉化抽取出的一些常用方法;
//Properties splitArrayElementsIntoProperties(String[] array, String delimiter):
// 把字元串數組中的每一個字元串按照給定的分隔符裝配到一個Properties中
String[] strs=new String[]{"key:value","key2:中文"};
Properties ps=StringUtils.splitArrayElementsIntoProperties(strs, ":");
//列印輸出:{key=value, key2=中文}
System.out.println(ps);
//Properties splitArrayElementsIntoProperties(String[] array, String delimiter, String charsToDelete)
//把字元串數組中的每一個字元串按照給定的分隔符裝配到一個Properties中,并删除指定字元串,比如括号之類的;
字元串和數組之間的基本操作
該組方法主要是完成字元串和字元串數組之間的基本操作,比如追加,删除,排序等;
// String[] addStringToArray(String[] array, String str):把一個字元串添加到一個字元串數組中
// 列印:[a, b, c, d]
System.out.println(Arrays.toString(StringUtils
.addStringToArray(new String[] { "a", "b", "c" }, "d")));
// String[] concatenateStringArrays(String[] array1, String[]array2):連接配接兩個字元串數組
//列印:[a, b, c, a, b, c]
System.out.println(Arrays.toString(StringUtils.concatenateStringArrays(
new String[] { "a", "b", "c" },
new String[] { "a", "b", "c","d" })));
//String[] mergeStringArrays(String[] array1, String[] array2):連接配接兩個字元串數組,去掉重複元素
//列印:[a, b, c, d]
System.out.println(Arrays.toString(StringUtils.mergeStringArrays(
new String[] { "a", "b", "c" },
new String[] { "a", "b", "c","d" })));
//String[] sortStringArray(String[] array):字元串數組排序
//列印:[a, b, c, d]
System.out.println(Arrays.toString(StringUtils.sortStringArray(new String[]{"d","c","b","a"})));
//String[] toStringArray(Collection<String> collection):把字元串集合變成字元串數組
//String[] toStringArray(Enumeration<String> enumeration):把字元串枚舉類型變成字元串數組
//String[] trimArrayElements(String[] array):把字元串數組中所有字元串執行trim功能;
//String[] removeDuplicateStrings(String[] array):去掉給定字元串數組中重複的元素,能保持原順序;
字元串和數組的更多方法
在該組方法中,提供了更多字元串和數組的方法,主要涉及到字元串數組的合并,字元串的按規則拆分,字元串和集合之間的互相轉化等操作;
//String[] split(String toSplit, String delimiter):按照指定字元串分割字元串;
assertArrayEquals(new String[]{"wolfcode","cn"}, StringUtils.split("wolfcode.cn", "."));
//隻分割第一次,列印:[www, wolfcode.cn]
System.out.println(Arrays.toString(StringUtils.split("www.wolfcode.cn", ".")));
//String[] tokenizeToStringArray(String str, String delimiters)
//會對每一個元素執行trim操作,并去掉空字元串
//使用的是StringTokenizer完成,
//列印[b, c, d]
System.out.println(Arrays.toString(StringUtils.tokenizeToStringArray("aa,ba,ca,da", "a,")));
//String[] tokenizeToStringArray(String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens)
//後面兩個參數在限定是否對每一個元素執行trim操作,是否去掉空字元串
//String[] delimitedListToStringArray(String str, String delimiter):分割字元串,會把delimiter作為整體分隔符
//列印:[a, b, c, da]
System.out.println(Arrays.toString(StringUtils.delimitedListToStringArray("aa,ba,ca,da", "a,")));
//String[] delimitedListToStringArray(String str, String delimiter, String charsToDelete)
//分割字元串,會把delimiter作為整體分隔符,增加一個要從分割字元串中删除的字元;
//String[] commaDelimitedListToStringArray(String str):使用逗号分割字元串
//是delimitedListToStringArray(str, ",")的簡單方法
//Set<String> commaDelimitedListToSet(String str):使用逗号分割字元串,并放到set中去重
//使用LinkedHashSet;
//String collectionToDelimitedString(Collection<?> coll, String delim, String prefix, String suffix)
//将一個集合中的元素,使用字首,字尾,分隔符拼裝一個字元串,字首後字尾是針對每一個字元串的
String[] arrs=new String[]{"aa","bb","cc","dd"};
assertEquals("{aa},{bb},{cc},{dd}", StringUtils.collectionToDelimitedString(Arrays.asList(arrs),",","{","}"));
//String collectionToDelimitedString(Collection<?> coll, String delim):集合變成指定字元串連接配接的字元串;
//是collectionToDelimitedString(coll, delim, "", "")的簡寫;
//String collectionToCommaDelimitedString(Collection<?> coll):集合變成逗号連接配接的字元串;
//是collectionToDelimitedString(coll, ",");的簡寫;
//String arrayToDelimitedString(Object[] arr, String delim):數組使用指定字元串連接配接;
//String arrayToCommaDelimitedString(Object[] arr):使用逗号連接配接數組,拼成字元串;
小結
StringUtils類中的方法其實真的還是很多,可能平時我們用的比較多的還是一些普通的方法,其實類似檔案路徑,檔案名等相關操作,以前還會專門引入common-io的FilenameUtils等額外的工具類,原來在StringUtils中都有,而且根據其設計的這些方法,我們也能大概的猜出一些方法在Spring中哪些地方可能有用;最後,其中有些方法,還是非常常見的面試題,比如替換字元串,查詢子串個數等,有興趣也可以看看Spring的具體實作。
