web-dev-qa-db-ja.com

Java 11のString trim()メソッドとstrip()メソッドの違い

その他の変更点として、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()の違いは何ですか?

64

要するに、strip()trim()の「Unicode対応」の進化です。

CSR:JDK-8200378

問題

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倍速いのはなぜですか?

66

これは、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());
    }
}
15
Michael Easter