Java Array 和 String 的轉換
英文標題【Array to String Conversions】
概述
本頁面中的內容對 Array 和 String 之間互相進行轉換的方法進行一些說明。
我們可以使用 原生 Java(vanilla Java) 或者一些第三方的 Java 工具類來實現這個轉換。ies.
將 Array 轉換為 String
在有時候我們希望將字串的數字或者整數型別的陣列轉換為字串。但是如果我們直接使用toString()來進行轉換的話,你可能會得到類似下面Ljava.lang.String;@74a10858的字串。
上面的字串顯示的是物件的型別和當前這個物件的雜湊程式碼。
但是,java.util.Arrays
Arrays.toString() 將輸入的陣列轉換為字串,在轉換後的字串將會使用逗號分隔符,同時在字串的前後會新增一個方括號 []。
可以考察下面的程式碼:
String[] strArray = {"one", "two", "three"};
String joinedString = Arrays.toString(strArray);
assertEquals("[one, two, three]", joinedString);
int[] intArray = {1, 2, 3, 4, 5};
joinedString = Arrays.toString(intArray);
assertEquals("[1, 2, 3, 4, 5]", joinedString);
StringBuilder 的 append() 方法
這個是基於 Java 的原生實現,你可以對需要轉換的陣列進行遍歷,然後將遍歷的結果使用 append() 方法新增到字串後面。
String[] strArray = {"Convert", "Array", "With", "Java"};
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < strArray.length; i++) {
stringBuilder.append(strArray[i]);
}
String joinedString = stringBuilder.toString();
assertEquals("ConvertArrayWithJava", joinedString);
另外,如果你的陣列中儲存的資料是整形的話,那麼你可以使用方法轉換函式,首先將整數型別轉換為字串後再新增。
Java Streams API
從 Java 8 及其以上的版本,你可以使用 String.join() 方法將給出的陣列元素使用不同的連線字串連線在一起,在我們使用案例中,我們使用空白字元進行連線。
String joinedString = String.join("", new String[]{"Convert", "With", "Java", "Streams"});
assertEquals("ConvertWithJavaStreams", joinedString);
更多的是,我們可以使用 Java Streams API 中的Collectors.joining()方法來進行連線,這個連線的方法將會保留和輸入資料相同的順序。
String joinedString = Arrays
.stream(new String[]{"Convert", "With", "Java", "Streams"})
.collect(Collectors.joining());
assertEquals("ConvertWithJavaStreams", joinedString);
StringUtils.join()
Apache Commons Lang為字串處理提供了非常好的方法,能夠很好的幫我們解決上面的問題。
這個 join 的方法可以通過輸入的資料進行自動進行合併,合併的結果與你輸入資料的順序相同。
String joinedString = StringUtils.join(new String[]{"Convert", "With", "Apache", "Commons"});
assertEquals("ConvertWithApacheCommons", joinedString);
Joiner.join()
同樣的 Guava 也提供了同樣的工具類來使用。
例如,我們可以使用下面的程式碼來對陣列進行連線。
String joinedString = Joiner.on("")
.skipNulls()
.join(new String[]{ "Convert", "With", "Guava", null });
assertEquals("ConvertWithGuava", joinedString);
將字串轉換為陣列
同樣的,在有些時候,我們希望能夠將字串轉換為陣列。
最常用的情況就是有一個輸入的字串,使用特定的分隔符,我們需要按照分隔符的位置將字串拆分為陣列。
String.split()
這個是最簡單的方法了,可以直接把字串中的字元使用給定的字元進行拆分,如下面的程式碼:
String[] strArray = "loremipsum".split("");
上面的程式碼將會生成下面的輸出,因為我們沒有給定任何分隔符,所以這個方法將會按照字元進行拆分。
["l", "o", "r", "e", "m", "i", "p", "s", "u", "m"]
StringUtils.split()
另外,可能用得最多的就是 Apache 的 Commons 中的StringUtils,這個能夠對指定的字串進行拆分。
如果使用 String 的方法進行拆分的話,可能會遇到空物件的問題,例如你輸入的字串可能是空字串,這個時候 String 自帶的原生方法將會丟擲空異常。
如果使用 StringUtils 方法的話,可以有效的避免空物件的異常,因此這個工具類是非常常用的。在預設的情況下,這個方法使用的是空格作為分隔符。
String[] splitted = StringUtils.split("lorem ipsum dolor sit amet");
上面的方法將會輸出下面的陣列。
["lorem", "ipsum", "dolor", "sit", "amet"]
Splitter.split()
最後,你還可以使用 Guava 的拆分 API,如果 Apache Commons 提供的方法,通常 Guava 也能提供類似的。
例如我們可以使用下面的方法進行拆分,可以看到的是,我們在拆分的時候可以同時對結果進行處理。
List<String> resultList = Splitter.on(' ')
.trimResults()
.omitEmptyStrings()
.splitToList("lorem ipsum dolor sit amet");
String[] strArray = resultList.toArray(new String[0]);
上面的程式碼能夠生成下面的結果:
["lorem", "ipsum", "dolor", "sit", "amet"]
結論
本頁面對 String 和 Array 之間的轉換方法進行了一些說明。一般來說可以使用原生方法進行轉換,但是我們通常不建議使用,主要是方法功能比較差,同時還非常容易出現空物件異常。
因此建議使用 Apache Commons 或者 Guava 的相關方法進行轉換。