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


103

その他の変更の中で、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()ですか?

回答:


105

つまり、のstrip()「Unicode対応」の進化形ですtrim()

CSR:JDK-8200378

問題

String :: trimは、Unicodeが今日広く使用されている標準に完全に進化していないJavaの初期の頃から存在していました。

String :: trimで使用されるスペースの定義は、スペースコードポイント(\ u0020)以下のコードポイントであり、一般にASCIIまたはISO制御文字と呼ばれます。

Unicode対応のトリミングルーチンは、Character :: isWhitespace(int)を使用する必要があります。

さらに、開発者はインデントの空白を明確に削除したり、末尾の空白を明確に削除したりすることができませんでした。

解決

Unicodeの空白を認識し、先頭のみまたは末尾のみの追加の制御を提供するトリミングメソッドを導入します。

これらの新しいメソッドの共通の特徴は、のような古いメソッドとは異なる(新しい)「空白」の定義を使用することString.trim()です。バグJDK-8200373

String :: trimの現在のJavaDocでは、コードで使用されている「スペース」の定義が明確にされていません。スペースの別の定義を使用する追加のトリミング方法が近い将来登場するため、明確化が不可欠です。String :: trimは、スペースの定義をスペース文字コードポイント(\ u0020)以下のコードポイントとして使用します。新しいトリミングメソッドでは、(空白)スペースの定義を、コードスペースとして渡されたときにtrueを返すコードポイントとして使用します。 Character :: isWhitespace述語。

メソッドisWhitespace(char)CharacterJDK 1.1で追加されましたが、メソッドisWhitespace(int)CharacterJDK 1.5までクラスに導入されませんでした。int補助文字をサポートするために、後者のメソッド(タイプのパラメーターを受け入れるメソッド)が追加されました。CharacterクラスのJavadocコメントは、補助文字(通常はintベースの「コードポイント」でモデル化)とBMP文字(通常は単一の文字でモデル化)を定義します。

U + 0000からU + FFFFまでの文字のセットは、Basic Multilingual Plane(BMP)と呼ばれることがあります。コードポイントがU + FFFFより大きい文字は、補助文字と呼ばれます。Javaプラットフォームは、char配列とStringおよびStringBufferクラスでUTF-16表現を使用します。この表現では、補助文字は一対のchar値として表されます...したがって、char値は、サロゲートコードポイントまたはUTF-16エンコーディングのコード単位を含む、Basic Multilingual Plane(BMP)コードポイントを表します。int値は、補足コードポイントを含むすべてのUnicodeコードポイントを表します。... char値のみを受け入れるメソッドは、補助文字をサポートできません。... int値を受け入れるメソッドは、補助文字を含むすべてのUnicode文字をサポートします。

OpenJDK Changeset


ベンチマークとの比較trim()strip()- Javaの11で空の文字列のためになぜString.stripは(ある)5倍高速String.trim(より)


6
興味深いことに、そのシンボル '\ u0000'はストリップでは削除されず、トリムで削除されます。
CHEM_Eugene

32

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

0

通常、どちらの方法でも、文字列から先頭と末尾のスペースが削除されます。ただし、Unicode文字または多言語機能を使用する場合に違いがあります。

trim()は、ASCII値が32以下の先頭と末尾のすべての文字( 'U + 0020'またはスペース)を削除します。

Unicode標準によれば、32( 'U + 0020')を超えるASCII値を持つさまざまなスペース文字があります。例:8193(U + 2001)。

これらのスペース文字を識別するために、新しいメソッドisWhitespace(int)がJava 1.5からCharacterクラスに追加されました。この方法では、Unicodeを使用してスペース文字を識別します。ユニコードのスペース文字について詳しくは、こちらをご覧ください

さまざまな空白文字をカバーして削除するために、Java 11の使用でこのCharacter.isWhitespace(int)メソッドに追加された新しいメソッドストリップ。

public class StringTrimVsStripTest {
    public static void main(String[] args) {
        String string = '\u2001'+"String    with    space"+ '\u2001';
        System.out.println("Before: \"" + string+"\"");
        System.out.println("After trim: \"" + string.trim()+"\"");
        System.out.println("After strip: \"" + string.strip()+"\"");
   }
}

出力

Before: "  String    with    space  "
After trim: " String    with    space "
After strip: "String    with    space"

注: Windowsマシンで実行している場合、Unicodeセットが制限されているため、同様の出力を表示できない場合があります。このコードをテストするために、いくつかのオンラインコンパイラを試すことができます。

リファレンス: トリムとストリップメソッドjavaの違い

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.