ファイルを 1 行ずつ読んでいて、特定の区切り文字に基づいて各行を分割したいと考えています。String クラスと StringUtils クラスで利用可能なオプションがいくつか見つかりました。
だから私の質問は、どちらを使用するのがより良いオプションであり、その理由は何ですか?
ファイルを 1 行ずつ読んでいて、特定の区切り文字に基づいて各行を分割したいと考えています。String クラスと StringUtils クラスで利用可能なオプションがいくつか見つかりました。
だから私の質問は、どちらを使用するのがより良いオプションであり、その理由は何ですか?
ユースケースによって異なります。
違いは何ですか?
String[] split(String regEx)
String[] results = StringUtils.split(String str,String separatorChars)
Apache utils split() はヌルセーフです。StringUtils.split(null)
戻りnull
ます。JDK のデフォルトは null セーフではありません。
try{
String testString = null;
String[] result = testString.split("-");
System.out.println(result.length);
} catch(Exception e) {
System.out.println(e); // results NPE
}
デフォルトのString#split()は、文字列の分割に正規表現を使用します。
Apache バージョンのStringUtils#split()は、空白/文字/文字列文字/null を使用します [split() メソッドの署名に依存します]。
複雑な正規表現は広範囲に使用すると非常にコストがかかるため、デフォルトString.split()
はお勧めできません。そうでなければ、それは良いです。
次のように文字列をトークン化するために使用すると、string.split() は追加の空の文字列を返します。一方、Apache のバージョンでは正しい結果が得られました
String testString = "$Hello$Dear$";
String[] result = testString.split("\\$");
System.out.println("Length is "+ result.length); //3
int i=1;
for(String str : result) {
System.out.println("Str"+(i++)+" "+str);
}
出力
Length is 3 Str1 Str2 Hello Str3 Dear
String[] result = StringUtils.split(testString,"$");
System.out.println("Length is "+ result.length); // 2
int i=1;
for(String str : result) {
System.out.println("Str"+(i++)+" "+str);
}
出力
Length is 2 Str1 Hello Str2 Dear
StringUtils.split のドキュメントには次のように記載されていることに注意してください。隣接するセパレーターは 1 つのセパレーターとして扱われます。 ,"" ,"parm4"] StringUtils.splitPreserveAllTokens が必要です