その他の変更点として、JDK 11では、Java.lang.Stringクラスに6つの新しいメソッドが導入されています。
repeat(int)
- int
パラメータで指定された回数だけ文字列を繰り返しますlines()
- Spliteratorを使用してソース文字列から遅延的に行を追加しますisBlank()
- 文字列が空か空白文字のみを含むかを示しますstripLeading()
- 先頭から空白を削除しますstripTrailing()
- 末尾から空白を削除しますstrip()
- 文字列の最初と最後の両方から空白を削除します特に、strip()
はtrim()
と非常によく似ています。 この記事strip*()
メソッドは以下のように設計されています。
String.strip()、String.stripLeading()、およびString.stripTrailing()の各メソッドは、対象となる文字列の前後、または前後の両方の余白(Character.isWhiteSpace()で決定)をトリミングします。
String.trim()
JavaDocは述べています:
/**
* Returns a string whose value is this string, with any leading and trailing
* whitespace removed.
* ...
*/
これは上記の見積もりとほとんど同じです。
Java 11以降のString.trim()
とString.strip()
の違いは何ですか?
要するに、strip()
はtrim()
の「Unicode対応」の進化です。
問題
String :: trimは、ユニコードが現在広く使用されている標準に完全には進化していなかったJavaの初期の頃から存在していました。
String :: trimによって使用されるスペースの定義は、スペースコードポイント(\ u0020)以下の任意のコードポイントであり、一般にASCIIまたはISO制御文字と呼ばれます。
Unicode対応のトリミングルーチンはCharacter :: isWhitespace(int)を使うべきです。
さらに、開発者はインデントの空白を削除することも、末尾の空白を削除することもできません。
解決策
Unicodeの空白スペースを認識し、先頭のみまたは末尾のみの追加の制御を提供するトリミング方法を紹介します。
これらの新しいメソッドの共通の特徴は、それらがString.trim()
のような古いメソッドとは異なる(より新しい) "空白"の定義を使用することです。バグ JDK-820037 。
String :: trimの現在のJavaDocでは、コードで使用されている「スペース」の定義が明確になっていません。スペースの異なる定義を使用する追加のトリミング方法が近い将来に登場しているので、明確化が不可欠です。 String :: trimは、スペースの定義をスペース文字codepoint(\ u0020)以下の任意のコードポイントとして使用します。新しいトリミングメソッドは、渡されたときにtrueを返すコードポイントとして(white)spaceの定義を使用します。 Character :: isWhitespaceの述語.
JDK 1.1では、メソッドisWhitespace(char)
がCharacter
に追加されましたが、JDK 1.5までメソッドisWhitespace(int)
はCharacter
クラスに導入されませんでした。補助文字をサポートするために、後者のメソッド(タイプint
のパラメータを受け入れるメソッド)が追加されました。 Character
クラスに対するJavadocのコメントでは、補助文字(通常はintベースの "コードポイント"でモデル化)とBMP文字(通常は1文字でモデル化)を定義しています。
U + 0000からU + FFFFまでの文字セットは、基本多言語面(BMP)と呼ばれることがあります。コードポイントがU + FFFFより大きい文字は補助文字と呼ばれます。 Javaプラットフォームは、char配列、およびStringクラスとStringBufferクラスでUTF-16表現を使用します。この表現では、補助文字は1対のchar値として表されます。したがって、char値は、サロゲートコードポイント、またはUTF-16エンコーディングのコード単位を含む基本多言語面(BMP)コードポイントを表します。 int値は、補助コードポイントを含むすべてのUnicodeコードポイントを表します。 ... char値のみを受け入れるメソッドは補助文字をサポートできません。 ... int値を受け入れるメソッドは、補助文字を含むすべてのUnicode文字をサポートします。
OpenJDK チェンジセット 。
trim()
とstrip()
のベンチマーク比較 - Java 11では、空白文字列に対してString.strip()がString.trim()より5倍速いのはなぜですか?
これは、Java 11を使用した@MikhailKholodkovによる答えを示すユニットテストです。
( \u2000
は\u0020
より上であり、trim()
による空白とは見なされません)
public class StringTestCase {
@Test
public void testSame() {
String s = "\t abc \n";
assertEquals("abc", s.trim());
assertEquals("abc", s.strip());
}
@Test
public void testDifferent() {
Character c = '\u2000';
String s = c + "abc" + c;
assertTrue(Character.isWhitespace(c));
assertEquals(s, s.trim());
assertEquals("abc", s.strip());
}
}